对Python 3中列表或os.listdir()的工作原理感到困惑
我有一些代码,发现列表或者方法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)