对Python 3中列表或os.listdir()的工作原理感到困惑

1 投票
1 回答
1351 浏览
提问于 2025-04-19 15:44

我有一些代码,发现列表或者方法os.listdir()的工作方式有点奇怪:

1.

import os
print(os.listdir(r'C:\Users\output'))

返回结果:

['AAIT.txt', 'AAL.txt', 'AAME.txt', 'AAOI.txt', 'AAON.txt', 'AAPL.txt', 'AAVL.txt', 'AAWW.txt' ....

结果是一个包含所有文件名的单一列表,这个是正常的。


2.

import os
for filenames in os.listdir(r'C:\Users\output'):
    for filename in filenames:
        print(filenames)

返回结果:

AAIT.txt
AAIT.txt
AAIT.txt
AAIT.txt
AAIT.txt
AAIT.txt
AAIT.txt
AAIT.txt
AAL.txt
AAL.txt

它把每个文件名打印了八遍。为什么会这样?filenames是一个列表,它应该像之前那样,按照文件夹里的文件数量打印整个列表。


3.

import os
for filenames in os.listdir(r'C:\Users\output'):
    for filename in filenames:
        print(filename)

返回结果:

A
A
I
T
.
t
x
t
A
A
...

每行一个字符,这很奇怪,为什么会这样?我本来希望这段代码能按我想要的方式工作,也就是每行打印一个文件名。

我该怎么做才能让Python每行打印一个文件名呢?

1 个回答

4

示例 2中,你打印的结果文件名的次数正好和文件名中的字符数量一样多:

for filenames in os.listdir(r'C:\Users\output'):
    for filename in filenames:
        print(filenames)

这里的filenames一个文件名。对这个文件名进行循环可以得到每一个单独的字符,这些字符是和filename(单数)绑定的,但你却为每个字符打印filenames复数):

>>> for foo in ('bar', 'bazbaz'):
...     for character in foo:
...         print(character, foo)
b bar
a bar
r bar
b bazbaz
a bazbaz
z bazbaz
b bazbaz
a bazbaz
z bazbaz

我在这里添加了character的打印,目的是为了说明发生了什么。如果文件名有8个字符,就会打印8次;如果文件名有7个字符(比如'AAL.txt'),就会打印7次,依此类推。

示例 3中,你只是打印了每个单独的字符。

去掉那个多余的循环,你不需要它。只需对os.listdir()的值进行循环即可:

import os

for filename in os.listdir(r'C:\Users\output'):
    print(filename)

撰写回答