Python无法从文件中读取

时间:2018-06-29 21:05:24

标签: python io

我试图遍历可验证非空的文本文件的行,并且我的脚本遇到问题。在尝试调试编写的内容时,我认为可以确保脚本正确地从文件中读取,因此我目前正在尝试打印其中的每一行。

起初,我尝试使用在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)来确保文件指针指向文件的开头,但这仍然行不通。

我花了一些时间阅读这里发布的类似问题的解决方案,但到目前为止,我没有尝试过。我不知道这样的基本I / O操作如何给我带来很多麻烦,但是我必须缺少一些基本知识,因此,我将非常感谢任何帮助/建议。

编辑:这是导致问题的脚本的一部分:

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)读取的文件已正确写入,但是我似乎无法在运行时从该文件读取。

EDIT-2:按照sudonym的建议,我正在使用绝对文件路径,并正在读取文件之前检查文件是否为空,方法是在两个{{1之间添加以下 unindented }}我在上一次编辑中写的语句:

with

第一个布尔值的值为print os.path.isfile(r'full/path/to/file') print (os.stat(r'full/path/to/file').st_size != 0) (表示文件存在),而第二个布尔值的值为True(表示文件为空)。这很奇怪,因为在我关闭写入文件的文件指针False之后添加了这两行,并且还因为写入(然后使用fo读取)的文件不为空在执行脚本后(实际上,它包含了应该包含的所有行)。

EDIT-3:原来我的脚本看到它需要读取的文件为空的原因是,它没有等待写入该文件的子进程(上例中的fp)停止执行,这意味着它将在我的第一个p2语句之前实际关闭之后(即在完成写入文件之前)执行这些行。因此,解决方法是在第一个with语句的末尾添加语句p2.wait(),如下所示:

with

现在一切都按照预期的方式进行。

2 个答案:

答案 0 :(得分:1)

在写入之后和读取之前,您可能首先需要flush()缓冲区(也许也调用os.fsync())。

请参见file.flush()this post

答案 1 :(得分:0)

首先,包括绝对路径。 其次,检查文件是否确实存在并且不为空:

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"