Python 尝试循环浏览多个文本文件并将第2行附加到列表中
我试图循环浏览一组文本文件,并将每个文件的第#2行附加到列表中。下面是我的示例代码。这看起来应该很接近,但我的列表中没有任何内容Python 尝试循环浏览多个文本文件并将第2行附加到列表中,python,python-3.x,Python,Python 3.x,我试图循环浏览一组文本文件,并将每个文件的第#2行附加到列表中。下面是我的示例代码。这看起来应该很接近,但我的列表中没有任何内容 import os directory = 'C:\\my_path\\' i=0 list2 = [] for filename in os.listdir(directory): with open(directory + filename) as infile: try: print(filename)
import os
directory = 'C:\\my_path\\'
i=0
list2 = []
for filename in os.listdir(directory):
with open(directory + filename) as infile:
try:
print(filename)
i=i+1
print(i)
data = infile.readlines()
for line in data:
if (line == 2):
list2.append(line)
infile.close()
except:
print(filename + ' is throwing an error')
print('DONE!!')
print(list2)
写作时:
对于行输入数据:
如果(行==2):
列表2.追加(行)
infle.close()
line
变量不是行的索引,而是作为字符串的行本身
还要注意,第二行的索引是1,而不是2,因为在Python中,索引从0开始
您至少应将此循环更改为:
对于索引,枚举中的行(数据):
如果(索引==1):
列表2.追加(行)
infle.close()
此外,正如@bruno desthuilliers所建议的,您不需要使用使用内存的readlines()
方法,而是可以像这样直接迭代文件:
#不需要infle.readlines()
对于索引,枚举(填充)中的行:
如果(索引==1):
列表2.追加(行)
infle.close()
最后,在用
块将语句包装到中时,不需要调用infle.close()
。这个电话是为你打的。当你测试line==2
时,你会问你从infle
读到的那一行是否等于2
(从来都不是)。相反,如果您在第2行,您需要一些计数器来测试。或者更好,只需索引到它:
data=infle.readlines()
列表2.append(数据[1])#索引1处的行是第二行
代码中的line==2
尝试将文本/字符串与数字2
进行比较,这无助于捕获正在读取的行的序号
相反,只需跳过第一行并将下一行附加到结果列表中即可
注意:
- 如果您只需要第二行,则无需阅读所有行
infle.readlines()
李>
- 将上下文管理器
与…一起使用时,无需关闭文件处理程序
另一种优雅的方法是下面的方法,它不需要遍历所有数据,也不需要自动打开和关闭文件
#打开时应注意自动打开和关闭文件。您不需要显式地关闭它。
打开(目录+文件名)作为填充:
尝试:
打印(文件名)
i=i+1
印刷品(一)
跳过计数=0
填充中的行:
跳过计数+=1
如果跳过计数==2:
列表2.追加(行)
break#这将超出循环,您不必遍历所有数据
除:
打印(文件名+'引发错误')
试试这个版本:
import os
directory = 'C:\\my_path\\'
secondLines = []
for filename in os.listdir(directory):
try:
#Use open() because it is optimized and does not read the whole file into RAM
with open(directory + "\\" + filename) as infile:
for lineIndex, line in enumerate(infile):
if lineIndex == 1:
secondLines.append(line)
except:
print(filename + ' is throwing an error')
print(secondLines)
您的版本:
import os
directory = 'C:\\my_path\\'
i=0
list2 = []
for filename in os.listdir(directory):
#add "\\" to read the correct file
with open(directory + "\\" + filename) as infile:
try:
print(filename)
i=i+1
print(i)
data = infile.readlines()
#To get the second line, you have to use indexes
for line in range(len(data)):
#if line (index) equals 1, it is the second line (0th element is first)
if (line == 1):
#If the index of the line is 1, append it to the list
#data[line] = take the element on index 1 from list data. Indexing starts at 0
list2.append(data[line])
infile.close()
except:
print(filename + ' is throwing an error')
print('DONE!!')
print(list2)
只需几点提示:1/基于零的索引不是python特有的东西,它实际上是规范,2/无需在内存中读取整个文件(.readlines()
)要获得第二行,您可以直接在文件上迭代。这非常好。如何通过插入换行符使其更具可读性?我认为这样做可以:list2.append('\n')在带有:list2.append(next(infle))@asher的行之后,next(infle)
应该已经使用了一个带有尾随换行符/linefeed的行。但是,如果存在一些特定于平台的问题,您可以使用list2.append(next(infle)+os.linesep)
Yes,Yes,它确实带有“\n”附加。也许这叫分裂,或者别的什么。与其像这样打印数据…['asset1\n'、'asset2\n'、'asset3\n']等,我更希望像这样打印数据。。。[asset1''asset2''asset3']我希望看到所有东西都垂直堆放/排列,这样更容易阅读。
import os
directory = 'C:\\my_path\\'
i=0
list2 = []
for filename in os.listdir(directory):
#add "\\" to read the correct file
with open(directory + "\\" + filename) as infile:
try:
print(filename)
i=i+1
print(i)
data = infile.readlines()
#To get the second line, you have to use indexes
for line in range(len(data)):
#if line (index) equals 1, it is the second line (0th element is first)
if (line == 1):
#If the index of the line is 1, append it to the list
#data[line] = take the element on index 1 from list data. Indexing starts at 0
list2.append(data[line])
infile.close()
except:
print(filename + ' is throwing an error')
print('DONE!!')
print(list2)