Как использовать содержимое файла для переименования нескольких файлов
У меня есть два файла (Running-2015-01-01.txt и Running-2015-01-02.txt), с информацией об имени хоста устройства для каждого файла. Моя цель состоит в том, чтобы переименовать эти файлы с разделом "Running" и заменить его именем хоста устройства из содержимого файла.
Это то, что я до сих пор. Интерпретатор не показывает никаких ошибок, но ничего не происходит с моими целевыми файлами:
for filename in glob.glob("Running*"):
selected_file = open(filename, "r").readlines()
for i, s in enumerate(filename):
if "hostname" in filename:
hostname_file = str(filename[i][8:]).strip()
os.rename(filename, hostname_file + filename[7:])
Я также создал отдельные функции для переименования файла и сбора информации о содержимом файла, и они работают.
собирать информацию из содержимого файла
def collect_string():
filename = raw_input("Enter your filename : ")
selected_file = open(filename, "r")
line = selected_file.readlines()
date_time = datetime.datetime.now().strftime("%Y-%m-%d")
for i, s in enumerate(line):
if "hostname" in s:
output = str(line[i][8:]).strip()
print output
переименуйте файл
def rename_file():
for filename in os.listdir("."):
if filename.startswith("Running"):
os.rename(filename, "Config" + filename[6:])
1 ответ
В вашем collect_string
Функция, вы проверяете, если "имя хоста" находится в строках файла, который работает. В первой функции вы проверяете, находится ли оно в имени файла, что, конечно, не работает.
Кроме того, вам не нужно использовать enumerate
, Вы можете циклически просматривать список с синтаксисом for element in myList
, как в вашей функции rename_file
,
Наконец, чтобы избежать путаницы, я предлагаю использовать более понятные имена переменных.
Вот ваш код исправлен (но не проверен):
def rename():
for filename in glob.glob("Running*"):
newName=collect_hostname(filename)+ filename[7:]
os.rename(filename,newName)
def collect_hostname(filename)
with open(filename) as f: #best practice to open a file
for line in f:
if "hostname" in line:
return line[8:].strip() #line is already a string, no need for str