【问题标题】:python 3.0 readline() random jumppython 3.0 readline() 随机跳转
【发布时间】:2013-05-11 15:02:31
【问题描述】:

我正在使用 python 3 内置的 readline() 函数逐行读取 txt 文件。该文件以块的形式包含员工信息,如下所示:

名字杰克\n
姓加西亚 \n
经理姓名史密斯\n
描述 这是员工的描述\n
bla bla bla bla \n
bla bla bla bla \n
布拉布拉布拉。 \n
工资25000\n

我的代码如下所示:

with open(os.path.join(INPUT_FOLDER, filename)) as input_file:
    for line in input_file:
        if line.upper().startswith('DESCRIPTION'):
            description = line.split('DESCRIPTION')[1].strip()
            line = input_file.readline()
            while not line.upper().startswith('SALARY'):
                ...

我在description 变量中得到了预期值,但是当input_file.readline() 语句被执行时,它又跳了5 行!!所以我无法正确完成其余的描述。让我生气的是,我之前在同一个文件中读取了其他员工信息块,并且一切正常。

我正在使用 pydev 2.7.1

在 Eclipse 下执行脚本

有人处理过类似的问题吗?是否与IDE、python版本、...有关?

提前谢谢你。

【问题讨论】:

  • while 块内的代码是什么?

标签: python text-files pydev readlines


【解决方案1】:

您不能混合使用文件迭代和 readline()。 file.next() 的Built-In Types doc 说:

“为了使 for 循环成为循环文件行的最有效方式(一种非常常见的操作),next() 方法使用隐藏的预读缓冲区。由于使用了 read -ahead 缓冲区,将 next() 与其他文件方法(如 readline())结合起来不能正常工作。但是,使用 seek() 将文件重新定位到绝对位置将刷新预读缓冲区。"

with open(os.path.join(INPUT_FOLDER, filename)) as input_file:
    while True:
        line = input_file.readline()
        if not line:
            break
        if line.upper().startswith('DESCRIPTION'):
            description = line.split('DESCRIPTION')[1].strip()
            line = input_file.readline()
            while not line.upper().startswith(SALARY):

【讨论】:

    【解决方案2】:

    您是在大写上进行比较,但在未修改的情况下进行拆分:

    line.split('DESCRIPTION')
    

    还有,这个

    line = input_file.readline()
    while not line.upper().startswith(SALARY):
    

    似乎没有附加到您的描述变量中。

    你可能需要添加

    line = input_file.readline()
    while not line.upper().startswith(SALARY):
        description += line
        line = input_file.readline()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多