首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python不读取文件

Python不读取文件
EN

Stack Overflow用户
提问于 2018-06-30 05:05:24
回答 2查看 986关注 0票数 1

我试图循环遍历一个文本文件的行,这个文本文件确实是非空的,并且我的脚本遇到了问题。在我尝试调试我所写的内容时,我认为我可以确保我的脚本能够正确地从文件中读取,所以我目前正在尝试打印其中的每一行。

首先,我尝试使用Python中的常用方法来完成此操作,即:

代码语言:javascript
复制
with open('file.txt') as fo:
    for line in fo:
         print line

但是我的脚本没有打印任何东西。然后我尝试将所有行存储在一个列表中,如下所示:

代码语言:javascript
复制
with open('file.txt') as fo:
    flines = fo.readlines()
print flines

然而,我的程序仍然输出一个空列表(即[])。在尝试读取文件之前,我还尝试使用fo.seek(0)确保我的文件指针指向文件的开头,但同样不起作用。

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

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

代码语言:javascript
复制
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行):

代码语言:javascript
复制
 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行,在读取文件之前检查文件是否为空:

代码语言:javascript
复制
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语句之后的行。因此,修复方法是在第一个with语句的末尾添加语句p2.wait(),如下所示:

代码语言:javascript
复制
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

现在,一切都按照它应该的方式工作。

EN

回答 2

Stack Overflow用户

发布于 2018-06-30 07:06:10

您可能需要首先对缓冲区执行flush()操作(也许还需要调用os.fsync() )-在写入之后和读取之前。

参见file.flush()this post

票数 1
EN

Stack Overflow用户

发布于 2018-06-30 05:14:20

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

代码语言:javascript
复制
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"
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51109397

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档