【问题标题】:seek() function not working in a nested loopseek() 函数在嵌套循环中不起作用
【发布时间】:2021-09-29 09:10:19
【问题描述】:

我正在为缩写构建一个自定义“翻译器”。它应该接受一个字符串输入,将其拆分为单个单词并将每个单词作为缩写返回。

示例: Input: above and aloft Returns: abv & alft

从 txt 文件中检索缩写词,其中缩写词和关键短语由制表符分隔。每一对都在单独的行上。

    import csv

# Used to lowercase the library
file = open('lib.txt', 'r')

lines = [line.lower() for line in file]
with open('lib.txt', 'w') as out:
     out.writelines(sorted(lines))

# Get user input
eng = input("Plain english input:")

# Split input into separate words
words = eng.split()

# Search every word in the file, return the first word (abbreviation) in the respective line
with open('lib.txt', newline='') as lib:
    lib_reader = csv.reader(lib, delimiter='\t')
    lib.seek(0)
    print(words)
    for x in words:
        print('1')
        lib.seek(0)
        for lib in lib_reader:
            print('2')
            if x in lib:
                print(lib[0])
                break


无论出于何种原因,它运行良好,找到第一个单词,中断,返回第一个循环并在 lib.seek(0) 上给出错误。

AttributeError: 'list' object has no attribute 'seek'

据我了解,它必须将光标重置到文件中文本的开头才能开始搜索第二个单词。 seek() 是为了防止它退出循环并继续搜索下一个参数。

【问题讨论】:

  • for lib in lib_reader: 是对变量lib 的赋值,将其先前的值覆盖为打开的文件对象。
  • 如果您将所有数据从lib.txt 读取到内存中会更简单(并且应该运行得更快)。

标签: python for-loop seek


【解决方案1】:

我想也许你在两件事上使用了相同的变量。该冲突将lib 文件句柄替换为lib 来自csv 阅读器的行,该行是一个列表。这就是您收到该错误的原因,因为该列表没有 seek 方法。

对于从lib_reader 读取的每一行,尝试使用lib_row 而不是lib

Python 没有块作用域,因此for 循环中的变量与函数中的变量相同。

        for lib_row in lib_reader:
            print('2')
            if x in lib_row:
                print(lib_row[0])
                break

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-02
    • 2017-06-01
    相关资源
    最近更新 更多