Я пытаюсь перебрать строки в текстовом файле, который непременно проверен, и у меня возникают проблемы с моим сценарием. Пытаясь отладить написанное, я решил, что мой скрипт правильно читает из файла, поэтому сейчас я пытаюсь напечатать каждую строку в нем.
Сначала я попытался использовать обычный способ сделать это в Python, т.е.
with open('file.txt') as fo:
for line in fo:
print line
но мой скрипт ничего не печатает. Затем я попытался сохранить все строки в списке следующим образом:
with open('file.txt') as fo:
flines = fo.readlines()
print flines
и все же моя программа все еще выводит пустой список (т.е. []
). Я также пытался убедиться, что мой указатель файла указывает на начало файла, используя fo.seek(0)
, прежде чем пытаться читать из него, но это также не работает.
Я потратил некоторое время на чтение решений похожих вопросов, опубликованных здесь, но пока ничего из того, что я пробовал, не сработало. Я не знаю, как такая элементарная операция ввода-вывода доставляет мне столько хлопот, но я, должно быть, упускаю что-то простое и поэтому буду очень признателен за любую помощь / предложения.
РЕДАКТИРОВАТЬ: Вот часть моего сценария, которая вызывает проблему:
import subprocess as sbp
with open('conf_15000.xyz','w') as fo:
p1 =sbp.Popen(['head','-n', '300000','nnp-pos-1.xyz'],stdout=sbp.PIPE)
p2 = sbp.Popen(['tail','-n', '198'],stdin=p1.stdout,stdout=fo)
with open('conf_15000.xyz','r') as fp:
fp.seek(0)
flines = fp.readlines()
print flines
А вот отрывок из файла nnp-pos-1.xyz
(все строки имеют одинаковый формат, всего их 370642):
Ti 32.9136715924 28.5387609200 24.6554922872
O 39.9997000300 35.1489480846 22.8396092714
O 33.7314699265 30.3398473499 23.8866085372
Ti 27.7756767925 31.3455930970 25.9779887743
O 31.1520937719 29.0752315770 25.4786577758
O 26.1870965535 32.4876155555 26.3346205619
Ti 38.4478275543 25.5734609650 22.0654953429
O 24.1328940232 31.3858060129 28.8575469919
O 38.6506317714 27.3779871011 22.6552032123
Ti 40.5617501289 27.5095900385 22.8436684314
O 38.2400600469 29.1828342919 20.7853056680
O 38.8481088254 27.2704154737 26.9590081202
При запуске сценария файл, из которого выполняется чтение (conf_15000.xyz
), записывается правильно, однако я не могу прочитать его во время выполнения.
РЕДАКТИРОВАТЬ-2: Следуя рекомендации Судонима, я использую абсолютный путь к файлу и проверяю, является ли файл пустым, прежде чем читать из него, добавив следующие неиспользуемые строки между двумя операторами with
Я написал в моем предыдущем редакторе:
print os.path.isfile(r'full/path/to/file')
print (os.stat(r'full/path/to/file').st_size != 0)
Первое логическое значение оценивается как True
(что означает, что файл существует), а второе - False
(что означает, что файл пуст). Это очень странно, потому что обе эти строки добавляются после того, как я закрываю указатель файла fo
, который записывает данные в файл, а также потому, что файл, в который выполняется запись (и впоследствии считываемая с помощью fp
), не становится пустым после выполнения команды скрипт (фактически он содержит все строки, которые он должен).
EDIT-3: Оказывается, причина, по которой мой сценарий увидел файл, который ему нужно было прочитать, как пустой, заключается в том, что он не ждал подпроцесса (p2
в приведенном выше примере), который пишет в него, чтобы остановить выполнение, то есть он будет выполнять строки после моего первого with
оператора до , когда указатель файла был фактически закрыт (то есть до того, как файл был завершен для записи). Поэтому было исправлено добавление оператора p2.wait()
в конце первого оператора with
следующим образом:
import subprocess as sbp
with open('conf_15000.xyz','w') as fo:
p1 =sbp.Popen(['head','-n', '300000','nnp-pos-1.xyz'],stdout=sbp.PIPE)
p2 = sbp.Popen(['tail','-n', '198'],stdin=p1.stdout,stdout=fo)
p2.wait()
with open('conf_15000.xyz','r') as fp:
fp.seek(0)
flines = fp.readlines()
print flines
Теперь все работает так, как положено.