#python #loops #filepath
#питон #петли #путь к файлу
Вопрос:
У меня есть список путей к файлам, и я хочу просмотреть этот список, открывая каждый файл и извлекая из него определенные точки данных. Однако, когда я запускаю код, он не открывает файл, он просто берет n-й символ из пути к файлу и добавляет его в список целей вместо значения из нужного мне файла.
for filename in file_list: file_data = open(filename, 'r') data_one.append(filename[5]) data_two.append(filename[6]) data_three.append(filename[7]) data_four.append(filename[8]) data_five.append(filename[9]) file_data.close()
Что я пропустил, чтобы сделать так, чтобы он на самом деле не открывал файлы?
Комментарии:
1. Видеть
filename[5]
. Вы добавляете имя файла в свой список.2. Вы можете распечатать
filename
и посмотреть, что это такое. А также распечататьfile_data
.3. Вы сделали нарезку по имени файла, а не по содержимому файла
4. Содержимое, которое вы должны искать, будет из file_data. Допустим, если данные file_data разделены запятыми, то вы можете разделить строку разделителем и взять из нее n-е значение индекса.
5. Файл открыт; вы просто игнорируете его.
Ответ №1:
Предполагая, что ваш файл выглядит так:
line0 line1 line2 line3 line4 line5 line6 line7 line8 line9
и вы хотите прочитать строки от «line5» до «line9», это правильный код:
for filename in file_list: with open(filename, 'r') as f: # This line opens the file and will close it data = f.readlines() data_one.append(data[5]) # These lines use `data` and not the filename data_two.append(data[6]) data_three.append(data[7]) data_four.append(data[8]) data_five.append(data[9])
Ответ №2:
Вы хотите читать из объекта file_data
, похожего на файл, а не из имени файла, чтобы обновить каждый список. Кроме того, файлоподобные объекты можно повторять, но они не могут быть проиндексированы. Если вам нужны строки 6-10, вам понадобится что-то вроде itertools.islice
.
from itertools import islice for file_name in file_list: with open(file_name) as f: points = islice(f, 5, 10) data_one.append(points[0]) data_two.append(points[1]) # etc
Я, вероятно, делаю слишком много предположений о фактическом формате файла, но главное в том, что вы должны использовать файлоподобный объект, возвращаемый open
вместо имени файла.