如何在Python中遍历文件

52 投票
5 回答
141316 浏览
提问于 2025-04-16 16:07

我有一个文本文件,里面有一些十六进制的数字,我想把它们转换成十进制。虽然我成功地进行了转换,但在循环之前,它似乎读取了一些不需要的字符,所以我遇到了以下错误。

Traceback (most recent call last):
  File "convert.py", line 7, in <module>
    print >>g, int(x.rstrip(),16)
ValueError: invalid literal for int() with base 16: ''

我的代码如下

f=open('test.txt','r')
g=open('test1.txt','w')
#for line in enumerate(f):  
while True:
    x=f.readline()
    if x is None: break
    print >>g, int(x.rstrip(),16)

每个十六进制数字都是单独一行输入的

5 个回答

7
with open('test.txt', 'r') as inf, open('test1.txt', 'w') as outf:
    for line in inf:
        line = line.strip()
        if line:
            try:
                outf.write(str(int(line, 16)))
                outf.write('\n')
            except ValueError:
                print("Could not parse '{0}'".format(line))

当然可以!请把你想要翻译的内容发给我,我会帮你把它变得更简单易懂。

14

你只需要用 for x in f: ... 这样的写法就可以了,这样可以一行一行地读取文件,代码更简洁易懂(部分原因是它会自动在文件结束时停止),而且也省去了调用 rstrip 的步骤,因为结尾的换行符已经被去掉了。

错误的原因在于退出条件,这个条件永远不会成立:即使文件已经读完,readline 也只会返回一个空字符串,而不是 None。另外要注意的是,你可能还会遇到空行的问题,比如在文件的最后。加上 if line.strip() == "": continue 这行代码可以让程序忽略空行,这样做其实是个不错的选择。

78

错误信息显示,可能是你文件的最后有一个空行。你可以这样来修复它:

f = open('test.txt','r')
g = open('test1.txt','w') 
while True:
    x = f.readline()
    x = x.rstrip()
    if not x: break
    print >> g, int(x, 16)

另外,使用 for x in f 这种方式会比 readline 更好。别忘了关闭你的文件,或者更好的是,使用 with 语句,这样它会自动帮你关闭文件:

with open('test.txt','r') as f:
    with open('test1.txt','w') as g: 
        for x in f:
            x = x.rstrip()
            if not x: continue
            print >> g, int(x, 16)

撰写回答