我是python的新手并尽可能快地学习。我知道如何在bash中解决我的问题并尝试使用python。 我有一个数据文件(示例中为data_array.csv)和索引文件index.csv,在该文件中我想从数据文件中提取索引文件中具有相同ID并存储到新文件中的数据, Out.txt。我还想在Out.txt中为那些在数据文件中没有值的ID添加NA。我知道如何为一列做到这一点。但我的数据有超过1000列(从1到1344)。我希望你帮助我一个可以更快地完成它的脚本。我的数据文件,索引ID和建议输出如下。
Id 1 2 3 . . 1344
1 10 20 30 . . -1
2 20 30 40 . . -2
3 30 40 50 . . -3
4 40 50 60 . . -4
6 60 60 70 . . -5
8 80 70 80 . . -6
10 100 80 90 . . -7
Id
1
2
8
9
10
必需输出
Id 1 2 3 . . 1344
1 10 20 30 . . -1
2 20 30 40 . . -2
8 80 70 80 . . -6
9 NA NA NA NA
10 100 80 90 . . -7
我试过
#! /usr/bin/python
import csv
with open('data_array.csv','r') as lookuplist:
with open('index.csv', "r") as csvinput:
with open('VlookupOut','w') as output:
reader = csv.reader(lookuplist)
reader2 = csv.reader(csvinput)
writer = csv.writer(output)
for i in reader2:
for xl in reader:
if i[0] == xl[0]:
i.append(xl[1:])
writer.writerow(i)
但它只适用于第一行。我希望该程序适用于我的数据文件的整个行和列。
答案 0 :(得分:2)
它只输出第一行,因为第一次在xl in reader
之后,你就在文件的末尾。之后你需要指向文件的开头。为了提高效率,您可以先将csvinput
读入字典,然后使用字典查找来获取所需的行:
#! /usr/bin/python
import csv
with open('data_array.csv','r') as lookuplist:
with open('index.csv', "r") as csvinput:
with open('VlookupOut','w') as output:
reader = csv.reader(lookuplist)
reader2 = csv.reader(csvinput)
writer = csv.writer(output)
d = {}
for xl in reader2:
d[xl[0]] = xl[1:]
for i in reader:
if i[0] in d:
i.append(d[i[0]])
writer.writerow(i)
答案 1 :(得分:1)
当您使用for xl in reader
读取CSV文件时,它将遍历每一行,直到它结束。但它只会这样做一次。您可以使用.seek(0)
告诉它返回CSV文件的第一行。
#! /usr/bin/python
import csv
with open('data_array.csv','r') as lookuplist:
with open('index.csv', "r") as csvinput:
with open('VlookupOut','w') as output:
reader = csv.reader(lookuplist)
reader2 = csv.reader(csvinput)
writer = csv.writer(output)
for i in reader2:
for xl in reader:
if i[0] == xl[0]:
i.append(xl[1:])
writer.writerow(i)
lookuplist.seek(0)