首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关闭文件错误的I/O操作(Python2)

关闭文件错误的I/O操作(Python2)
EN

Stack Overflow用户
提问于 2017-07-22 10:34:26
回答 1查看 57关注 0票数 0

作为新手我需要你的帮助。当我试图在txt文件列表中重命名列时,我陷入了一个问题。在重命名它之前,我移除空间。

代码语言:javascript
复制
with open("smpl_list.txt", "r") as m, open ("smpl.txt","w") as n:
sys.stdout=n
for line in m:
    print line.strip()

导入熊猫以重命名列后

代码语言:javascript
复制
import pandas as pd
df=pd.read_csv("smpl.txt", sep=" ", header=None, names=["a","b","c","d"])
print (df)

但我经常收到“关闭文件上的I/O操作”错误。如我所知,用块自动关闭文件,但问题在哪里,我真的看不见。

编辑:这里是我的工作代码,贡献了@COLDSPEED

代码语言:javascript
复制
with open("smpl_list.txt", "r") as m, open ("smpl.txt","w") as n:
for line in m:
    n.write(line.strip()+"\n")

以及重命名列的第二部分。

代码语言:javascript
复制
import pandas as pd
with open ("smp.txt", "w") as r:
    df=pd.read_csv("smpl.txt", sep=" ", header=None, names=["a","b","c","d"])
    print>> r, df

列表的最后结果,它没有左空格(前面有)和列名。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-22 10:43:46

改变sys.stdout用打印重定向是错误的做法,因为你会造成不可逆转的损害。

发生此问题是因为您将其重新分配到上下文管理器中的文件指针。退出with块后,管理器将自动关闭,因此sys.stdout指向一个已关闭的文件,这就是您获得该错误的原因。

你有两个选择。第一个选项是通过重新加载sys来修复这个问题。你可以用

代码语言:javascript
复制
import imp
imp.reload(sys)

第二个更好的选择(我更喜欢)是完全不进入这种情况。Python2 2的print语句有一个语法,允许您重定向而不必跳过循环:

代码语言:javascript
复制
with open("smpl_list.txt", "r") as m, open ("smpl.txt","w") as n:
    for line in m:
        print >> n, line.strip()

或者,稍微好一点:

代码语言:javascript
复制
with open("smpl_list.txt", "r") as m, open ("smpl.txt","w") as n:
    for line in m:
        n.write(line.strip() + '\n')
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45253533

复制
相关文章

相似问题

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