【发布时间】:2014-12-05 22:08:38
【问题描述】:
提前感谢您的帮助。
我是 Python 新手,正在尝试将文件从一种格式转换为另一种格式。
这是我的代码:
fs = open('sample_data.txt','r')
fnew = open('sample_output.txt','w')
with fs as f:
while True:
line = f.readline()
if line and line[0]=='#':
print(line)
fnew.write(line + '\n')
else:
data=line.split()
fnew.write(data[0])
if not line: break
print('end of program')
fs.close
fnew.close
文件的基本格式在顶部包含注释的标题,然后是数据行。
我遇到的问题是我的 fnew.write(data[0]) 行。我收到以下错误:
IndexError: 列表索引超出范围
行拆分拆分了八列数据,我想删除其中的前两列。所以,最终,我想要做的是重写整个文件减去前两列。我需要做一些更复杂的重新格式化,但我希望如果我能理解这一步中的错误,我可能会弄清楚如何做剩下的。
------------- 更新
阿巴内特,你是对的。这是导致错误的换行符。但是,正如您所说,在尝试添加支票时我遇到了另一个问题。当我执行下面的代码时,一切都冻结了我。如果我删除“如果数据:”检查,那么它会运行但给我同样的“索引超出范围”错误。
我还尝试在删除“if data:”检查的情况下运行它,并使用不包含换行符的示例数据文件,它也冻结了我。
谁能解释这可能是什么原因造成的?
fs = open('sample_data.txt','r')
fnew = open('sample_output.txt','w')
with fs as f:
while True:
line = f.readline()
for line in f:
if line[0]=='#':
print(line)
fnew.write(line + '\n')
else:
data=line.split()
if data:
print(data[0])
fnew.write(data[0] + '\n')
print('end of program')
fs.close
fnew.close
------------- 更新 2
以下代码有效。感谢 abarnet 澄清无限循环问题。我遇到的最后一个问题是数据的第一行,无论是换行符还是标题行都被忽略并且不会在输出中打印。
with open('sample_data.txt','r') as f, open('sample_output.txt','w') as fnew:
line = f.readline()
for line in f:
if line[0]=='#':
print(line)
fnew.write(line + '\n')
else:
data=line.split()
if data:
print(data[0])
fnew.write(data[0] + '\n')
print('end of program')
fnew.close()
【问题讨论】:
-
尝试将错误的 fwrite 包装在 try-except 块中,并在 except 块中打印数据以查看您有什么
-
在您尝试写入之前调用您的数据变量的 print。它输出什么?
-
顺便说一句..您可以将这三行“with fs as f: / while True: / line = f.readline()”替换为以下“for line in fs.readlines() :"。这不会解决你的问题,但它会让你的代码看起来更好(我的意思是更简单)。