Python не читает из файла - PullRequest
0 голосов
/ 30 июня 2018

Я пытаюсь перебрать строки в текстовом файле, который непременно проверен, и у меня возникают проблемы с моим сценарием. Пытаясь отладить написанное, я решил, что мой скрипт правильно читает из файла, поэтому сейчас я пытаюсь напечатать каждую строку в нем.

Сначала я попытался использовать обычный способ сделать это в 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

Теперь все работает так, как положено.

Ответы [ 2 ]

0 голосов
/ 30 июня 2018

Возможно, вам сначала нужно flush() буферизировать (и, возможно, также вызвать os.fsync()) - после записи и перед чтением.

См. file.flush () и этот пост .

0 голосов
/ 30 июня 2018

сначала включите абсолютный путь. Во-вторых, проверьте, существует ли файл и не является ли он пустым:

import os

FILEPATH = r'path\to\file.txt' # full path as raw string
if os.path.isfile(FILEPATH) and (os.stat(FILEPATH).st_size != 0): 
   with open(FILEPATH) as fo:
        flines = fo.readlines()
        print flines
else:
    print FILEPATH, "doesn't exist or is empty"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...