Python |从多个csv文件读取并添加到嵌套列表

时间:2018-07-23 16:25:16

标签: python list pandas csv nested-lists

我有这样的csv文件(位于同一目录中):

文件1:

Id,Param1,Param2
1,10,12
2,16,18
3,24,28
4,22,26

文件2:

Id,Param1,Param2
1,13,19
2,15,23
3,21,25

我想读取文件并创建嵌套列表,如下所示:

Param1 = [[10, 16, 24, 22], [13, 15, 21]]
Param2 = [[12, 18, 28, 26], [19, 23, 25]]

我尝试过的事情:

for i in range(1,nof+1,1):
    with open("File%i.csv" %i, "rb") as f1:
        reader = csv.reader(f1)

        for row in reader:
            Param1.append(row[1])
            Param2.append(row[2])

最后:

[Param1[i:i + n] for i in range(0, len(Param1), n)]
[Param2[i:i + n] for i in range(0, len(Param2), n)]

如果我所有文件中的行数相同,则可以正常工作,但事实并非如此。我的文件行数不相等。因此,有人可以帮助我弄清楚如何创建这些拆分。非常感谢。

4 个答案:

答案 0 :(得分:1)

您可以使用熊猫吗?

import pandas as pd

dfs = []
nof = 2
for i in range(1, nof+1, 1):
    dfs.append(pd.read_csv("File{}.csv".format(i)))

param1_list = [list(df['Param1']) for df in dfs]
param2_list = [list(df['Param2']) for df in dfs] 

print(param1_list)
print(param2_list)

try it here

答案 1 :(得分:1)

稍微修改了样本输入。

cat file1
1|10|12
2|16|18
3|24|28
4|22|26

cat file2
1|13|19
2|15|23
3|21|25

示例代码

def process(filename):
    first_list = []
    second_list = []
    with open(filename, 'r') as fh:
        for line in fh:
            line = line.rstrip()
            dummy, first_field, second_field = line.split('|')
            first_list.append(first_field)
            second_list.append(second_field)

        return [first_list, second_list]

print (process('file1'))
print (process('file2'))

输出

[['10', '16', '24', '22'], ['12', '18', '28', '26']]
[['13', '15', '21'], ['19', '23', '25']]

答案 2 :(得分:1)

这是使用字典和csv.reader的一种方法:

from io import StringIO
import csv

file1 = StringIO("""Id Param1 Param2
1   10     12
2   16     18
3   24     28
4   22     26""")

file2 = StringIO("""Id Param1 Param2
1   13     19
2   15     23
3   21     25""")

res = {}
for i, file in enumerate([file1, file2]):
    # replace file with open('...', 'r')
    with file as fin:
        reader = csv.reader(file, delimiter=' ', skipinitialspace=True)
        next(reader)  # exclude header row
        res[i] = {idx: list(map(int, x)) for idx, x in enumerate(zip(*reader))}

Param1 = [res[0][1], res[1][1]]
Param2 = [res[0][2], res[1][2]]

print(Param1, Param2, sep='\n')

[[10, 16, 24, 22], [13, 15, 21]]
[[12, 18, 28, 26], [19, 23, 25]]

答案 3 :(得分:1)

>>> from collections import defaultdict
... from csv import DictReader
... 
... 
... def solution(filenames):
...     result = defaultdict(list)
...     for filename in filenames:
...         d = defaultdict(list)
...         with open(filename, 'r') as f:
...             reader = DictReader(f)
...             for line in reader:
...                 for k, v in line.items():
...                     d[k].append(int(v))
... 
...         for k, v in d.items():
...             result[k].append(v)
...     return result
... 
>>> result = solution(['file1.csv', 'file2.csv'])
>>> result['Param1']
[[10, 16, 24, 22], [13, 15, 21]]
>>> result['Param2']
[[12, 18, 28, 26], [19, 23, 25]]