在Python列表元素内进行迭代

3

如何读取一行文本的文件并需要迭代每个元素?该文件需要在“with”语句之外的脚本内访问。

例如,file.txt不带引号包含单行“abcdefg”。如果我编写下面的代码,则无法正常工作,因为我认为我正在列表中创建单个元素(即lines = ['abcdefg']):

file = 'file.txt'
with open(file) as file_object:
    lines = file_object.readlines()
for letter in lines:
     if letter == "a":
         print(letter)

我假设这个代码在lines内部创建了一个"abcdefg"的单一元素,但显然与"a"不同。

我可以通过将列表转换为字符串来解决这个问题:

{snip}
text_file_string = ''.join(lines)
for letter in text_file_string:
    if letter == "a":
        print(letter)

这确实可行。我想我的真正问题是,有没有更好的方法来完成这个任务?似乎把它作为列表再转换成字符串是一个绕远路的方法。我想我可以直接将其导入到字符串中,跳过整个列表的步骤。只是想知道我是否可以将其作为列表来完成我想要的操作。


使用嵌套for循环怎么样? - Willem Van Onsem
4个回答

2
似乎你需要的是.read()而不是.readlines().readlines会返回一行一行的数组,而你需要整个文件作为一个字符串,因此使用.read()
file = 'file.txt'
with open(file) as file_object:
    content = file_object.read()
    for letter in content:
         if letter == "a":
             print(letter)

0

通过循环遍历每一行,您可以逐行获取文本。再通过循环遍历每一行中的每一个字符,您就可以逐个获取每个字符了:

file = 'file.txt'
with open(file) as file_object:
    lines = file_object.readlines()
for line in lines:
    for letter in line:
        if letter == "a":
             print(letter)

0

你需要嵌套第二个for循环。

file = 'file.txt'
with open(file) as file_object:
    lines = file_object.readlines()
for line in lines:
    for letter in line:
        if letter == "a":
            print(letter)

1
我甚至没有考虑嵌套循环。这也非常好,因为它保留了列表形式的数据。 - Biggen

0
同意其他人的观点,但有一个额外的建议。文件对象是可迭代的。您可以利用这个事实简化代码,像这样。
with open("myfile.txt", "rt") as file_ob:
    for line in file_ob:
        for letter in line:
            if letter == "a":
                print(letter)

1
我是Python的新手(不到几周),所以我得谷歌一下“rt”参数。不过还是要感谢@Phil Cote。有时候有太多做事情的方式,会让人感到不知所措。 - Biggen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接