我正在尝试循环遍历可验证非空的文本文件的行,并且我的脚本遇到了问题。在我尝试调试我写的内容时,我想我会确保我的脚本正确地从文件中读取,所以我目前正在尝试打印其中的每一行。
起初我尝试使用 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 的建议,我使用绝对文件路径,并在读取文件之前检查文件是否为空,方法是在我之前编辑中编写的两个 with
语句之间添加以下
unindented行:
print os.path.isfile(r'full/path/to/file')
print (os.stat(r'full/path/to/file').st_size != 0)
第一个布尔值的计算结果为
True
(表示文件存在),而第二个布尔值的计算结果为 False
(表示文件为空)。这很奇怪,因为这两行都是在我关闭写入文件的文件指针 fo
之后添加的,而且还因为在我执行以下命令后,正在写入的文件(随后使用 fp
读取)不为空脚本(事实上,它包含所有应该包含的行)。
原来我的脚本看到它需要读取的文件为空的原因是因为它没有等待写入它的子进程(上例中的
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
现在一切都按预期进行。
首先,包含绝对路径。 其次,检查文件是否确实存在并且不为空:
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"