冷凝重复代码

时间:2015-03-31 19:40:50

标签: python python-2.7

我创建了一个简单的应用程序,它可以加载多个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个列表,但是如果我将另一个文件名传递给该函数,它将附加到同一个列表中。不确定最好的办法。

3 个答案:

答案 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的答案,以便更好地使用withlist()以及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]

功能解决方案更短,不需要临时变量。

相关问题