使用循环打开和处理带有csv的txt文件

Using a loop to open and process txt files with csv

我有数据(txt 文件中的混合文本和数字),我想编写一个 for 循环来创建列表列表,这样我就可以使用更少的行来处理所有文件中的数据。

到目前为止我已经写了这个:

import csv

path = (some path...)
files = [path + 'file1.txt',path + 'file2.txt', path + 
'file3.txt', ...]

for i in files:
    with open(i, 'r') as j:
        Reader = csv.reader(j)
        List = [List for List in Reader]

我想我覆盖了 List 而不是创建嵌套列表,因为我得到了大小为 1 的 Reader 和一个包含其中一个文件维度的列表。

我的问题:

  1. 鉴于文件可能包含不同的行号,保存一些代码行是正确的做法吗? (还有什么可以做得更好?)
  2. 我认为问题出在 [List for List in Reader],有没有办法改变它,这样我就不会覆盖 List?像添加到 List?

是的,使用 .append():

import numpy as np
import matplotlib.pyplot as plt
import csv
path = (some path...)
files = [path+x for x in ['FILESLIST']]

for i in files:
    with open(i, 'r') as j:
        Reader = csv.reader(j)
        List.append([L for L in Reader])

您可以使用列表 append() 方法添加到现有 list。由于 csv.reader 个实例是可迭代对象,您可以将其中一个实例传递给方法,如下所示:

import csv
from pathlib import Path

path = Path('./')
filenames = ['in_file1.txt', 'in_file2.txt']  # etc ...
List = []

for filename in filenames:
    with open(path / filename, 'r', newline='') as file:
        List.append(list(csv.reader(file)))

print(List)

更新

一个更简洁的方法是使用一个叫做“list comprehension”的东西:

import csv
from pathlib import Path

path = Path('./')
filenames = ['in_file1.txt', 'in_file2.txt']  # etc ...
List = [list(csv.reader(open(path / filename, 'r', newline='')))
            for filename in filenames]

print(List)