【问题标题】:How to iterate over the file in python如何在python中遍历文件
【发布时间】:2011-08-09 15:47:25
【问题描述】:

我有一个包含一些十六进制数字的文本文件,我正在尝试将其转换为十进制。我可以成功转换它,但似乎在循环存在之前它读取了一些不需要的字符,所以我收到以下错误。

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)

每个十六进制数都换行输入

【问题讨论】:

  • 好吧,使用调试器并找出导致问题的“x”值。也许您有一个带有 BOM 的文件?
  • @RestRisiko:如果有 BOM,错误消息会显示。不,它只是试图将空字符串'' 提供给int

标签: python


【解决方案1】:

回溯表明您可能在文件末尾有一个空行。 你可以这样修复它:

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)

【讨论】:

  • 在最近的版本中可以减少后者的缩进量:with open('test.txt','r') as f, open('test1.txt','w') as g
  • @delnan,不错的新东西!当缩进不是问题时,我仍然更喜欢两行形式。我读得更好......
  • 哎呀!为什么投反对票?如果没有解释,downvotes 是没有用的,尤其是当 OP 已经接受了答案时。
  • 第一个程序给出了同样的错误,我们最后有一个空行
  • 这是 Python 习语“干净”的一个很好的例子——不需要 EOF、readline()、writeline() 或任何胆量——只是概念:遍历一个文件中的行,转换并导出到另一个文件。很不错! (+1)
【解决方案2】:

只需使用for x in f: ...,它可以让您一行接一行地使用,更短且可读性更强(部分原因是它会在文件结束时自动停止),并且还为您节省了rstrip 调用,因为尾随换行符已被删除。

该错误是由退出条件引起的,它永远不会为真:即使文件耗尽,readline 将返回一个空字符串,而不是None。另请注意,您仍然可能会遇到空行问题,例如在文件的末尾。添加if line.strip() == "": continue 会使代码忽略空白行,这无论如何都是一件好事。

【讨论】:

  • 这不会去除尾随的换行符:python -c 'with open("file.txt") as f: print(repr([l[-1] for l in f]))' 在 Python 2.7.12 和 3.4.5 上返回许多 \n 实例
【解决方案3】:
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))

【讨论】:

  • 休 - outf.write(int(line, 16)) 对你有用吗?我的代码与您的代码完全相同,只是我正在尝试编写字典 d。我得到一个值错误。见下文: Traceback(最近一次调用最后一次):文件“./test.py”,第 22 行,在 outf.write(d) ValueError: I/O operation on closed file
【解决方案4】:

您应该了解EAFPLBYL

from sys import stdin, stdout
def main(infile=stdin, outfile=stdout):
    if isinstance(infile, basestring):
        infile=open(infile,'r')
    if isinstance(outfile, basestring):
        outfile=open(outfile,'w')
    for lineno, line in enumerate(infile, 1):
        line = line.strip()
         try:
             print >>outfile, int(line,16)
         except ValueError:
             return "Bad value at line %i: %r" % (lineno, line)

if __name__ == "__main__":
    from sys import argv, exit
    exit(main(*argv[1:]))

【讨论】:

    【解决方案5】:

    这可能是因为您的输入文件末尾有一个空行。

    试试这个:

    for x in f:
        try:
            print int(x.strip(),16)
        except ValueError:
            print "Invalid input:", x
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-13
      • 1970-01-01
      • 2018-10-06
      • 1970-01-01
      • 2020-07-05
      • 1970-01-01
      • 2020-07-21
      • 1970-01-01
      相关资源
      最近更新 更多