我创建了一个简单的应用程序,它可以加载多个csv并将它们存储到列表中。
import csv
import collections
list1=[]
list2=[]
list3=[]
l = open("file1.csv")
n = open("file2.csv")
m = open("file3.csv")
csv_l = csv.reader(l)
csv_n = csv.reader(n)
csv_p = csv.reader(m)
for row in csv_l:
list1.append(row)
for row in csv_n:
list2.append(row)
for row in csv_p:
list3.append(row)
l.close()
n.close()
m.close()
我想创建一个对此负责的函数,这样我就可以避免重复并清理代码,所以我在想这样的事情。
def read(filename):
x = open(filename)
y = csv.reader(x)
for row in y:
list1.append(row)
x.close()
然而,当我进入追加到列表的for循环时,对我来说很难。这可以附加到1个列表,但是如果我将另一个文件名传递给该函数,它将附加到同一个列表中。不确定最好的办法。
答案 0 :(得分:3)
您每次只需创建一个新列表,并从您的函数返回:
def read(filename):
rows = []
x = open(filename)
y = csv.reader(x)
for row in y:
rows.append(row)
x.close()
return rows
然后按如下方式调用
list1 = read("file1.csv")
另一种选择是将列表作为参数传递给您的函数 - 然后您可以选择是每次创建一个新列表,还是将多个CSV附加到同一列表中:
def read(filename, rows):
x = open(filename)
y = csv.reader(x)
for row in y:
rows.append(row)
x.close()
return rows
# One list per file:
list1 = []
read("file1.csv", list1)
# Multiple files combined into one list:
listCombined = []
read("file2.csv", listCombined)
read("file3.csv", listCombined)
我在答案中使用了您的原始代码,但另请参阅Malik Brahimi的答案,以便更好地使用with
和list()
以及DogWeather&#39来编写函数体本身;评论 - 这里有很多不同的选择!
答案 1 :(得分:3)
您可以创建单个函数,但使用with
语句进一步缩小:
def parse_csv(path):
with open(path) as csv_file:
return list(csv.reader(csv_file))
答案 2 :(得分:0)
我喜欢@DNA的方法。但考虑一种纯粹的功能风格。这可以构建为地图操作,可以转换
["file1.csv", "file2.csv", "file3.csv"]
为...
[list_of_rows, list_of_rows, list_of_rows]
这个函数会像这样调用:
l, n, m = map_to_csv(["file1.csv", "file2.csv", "file3.csv"])
并且map_to_csv
可以实现如下:
def map_to_csv(filenames):
return [list(csv.reader(open(filename))) for filename in filenames]
功能解决方案更短,不需要临时变量。