Python 尝试循环浏览多个文本文件并将第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)

我试图循环浏览一组文本文件,并将每个文件的第#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)
            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)