在单个文件中写入2个csv文件的公共元素(具有不同的列数)

时间:2018-09-27 09:10:43

标签: python-3.x pandas csv

我有2个以下格式的csv文件-

File1

David
Lennon

File2

David  0.3
Lennon 1.3
Wright 2.5

所需的输出-

David 0.3
Lennon 1.3

我正在读取两个csv文件,然后检查文件2中是否存在相同的第一列,如果存在,我想保留它,然后删除其中的其余列,但是我不知道该怎么做第一个元素。

with open ('file1.csv') as h:
   an = h.readlines()
with open ('file2.csv') as n:
   non = n.readlines()

anno=[]
for i in an:
   anno.append(i.decode('utf-8').strip())

diff={}
for i in non:
   if i.decode('utf-8')[0].strip() in anno:
     diff[i[0]] = i[1]

我认为最后一行出现错误,这不是访问csv文件的第一列和第二列的正确方法。 怎么做?

1 个答案:

答案 0 :(得分:1)

首先,如果您使用csv格式,请确保使用逗号分隔值(csv =逗号分隔值)。因此,将file1和file2更改为此:

David
Lennon

David,0.3
Lennon,1.3
Wright,2.5

好的,所以如果我是对的,那么您只想从file2中获取在file1中紧迫的数据名称。我将变量的名称更改为隐秘的名称,因为我不明白您的含义,但是为了清楚起见,我将最后一个Dictionary保留为diff(所需的输出)。

现在从文件1中读取名称,并将其放入带有阅读行的列表中,但是“ \ n”中仍然存在一些不需要的内容。我在for循环中将换行符替换为空,然后从列表中创建列表,仅保留名称。

with open ("file1.csv") as file1:
   data_file1 = [name.replace("\n", "") for name in file1.readlines()]

对于file2执行相同的操作并创建一个用逗号分隔的列表,因此,“ David,0.3”变为[“ David”,“ 0.3”]。请注意,值的类型仍然是字符串。

with open ("file2.csv") as file1:
   data_file2 = [name.replace("\n", "").split(",") for name in file1.readlines()]

现在比较文件1和文件2中的数据:

diff = {}
for line in data_file2:
    if line[0] in data_file1:
        diff[line[0]] = line[1]

第[0]行是名称,第[1]行是该名称的对应值。

现在diff应该返回

>>> diff
{'David': '0.3', 'Lennon': '1.3'}

干杯, 耶尔