【问题标题】:How to extract data from multiple files which is inside another file using python?如何使用python从另一个文件中的多个文件中提取数据?
【发布时间】:2020-08-18 17:48:39
【问题描述】:

我有一个 CSV 文件名“sample.csv”,它有一些列:

id  name      contactno. fileName
1   robin      1234455    info_v1.csv
2   elsa,roy   42342442   info_v1.csv
3   john       232323     info_v2.csv

fileName 列中提到的文件包含一些文本消息。

info_v1.csv

id  message
1   my name is robin. I am from Berlin
2   my name is Elsa. My age is 12

info_v2.csv

id  message
3   my name is John.I play football.

现在我想创建一个包含所有信息的文件。例如:

输出.csv

id  name       contactno. message
1   robin      1234455    my name is robin. I am from Berlin
2   elsa,roy   42342442   my name is Elsa. My age is 12
3   john       232323     my name is John.I play football.

我到目前为止所做的如下:

csvfile = csv.reader(open('sample.csv', newline='',encoding="utf8"))
next(csvfile)
included_cols = [0, 1, 2, 3]
for row in csvfile:
    content = list(row[i] for i in included_cols)
    filename=content[3]
        
    with open(filename, newline='') as f:
        
        reader = csv.reader(f)
        next(reader)
        for row1 in reader:
            
            content1 = row1
        
    my_list1=content+content1

但在这里我无法将所有信息保存在一起以创建 output.CSV,我如何匹配 id 以便它不会从 info.csv 中获取错误的数据?

【问题讨论】:

  • 文件实际上是 CSV(逗号分隔)到 TSV(制表符分隔)吗?因为似乎是 TSV,尤其是在此字段中使用逗号:elsa,roy。
  • 逗号分隔,但 elsa 是 firstName 而 Roy 是 lastName

标签: python python-3.x list python-2.7


【解决方案1】:

创建一个函数,读取sample.csv中提到的文件,然后comapre id并返回对应的message

import csv

def get_message(name, id):
    with open(name) as fp:
        reader = csv.DictReader(fp)
        for row in reader:
            if row['id'] == id:
                return row['message']

with open('sample.csv') as fp, open('output.csv', 'w') as fw:
    reader = csv.reader(fp)
    writer = csv.writer(fw)
    columns = next(reader)[:-1] + ['message']
    writer.writerow(columns)
    for row in reader:
        new_row = row[:-1] + [get_message(row[-1], row[0])]
        writer.writerow(new_row)

输出:

 id      name  contactno.                             message
  1     robin     1234455  my name is robin. I am from Berlin
  2  elsa,roy    42342442       my name is Elsa. My age is 12
  3      john      232323    my name is John.I play football.

【讨论】:

  • 谢谢。你能告诉我为什么每次输入后都会打印新行吗?
  • 在get_message()函数改变return这样的声明return row['message'].strip()
  • return row['message'].strip() 仍然返回新行。但不知何故,我通过在 with open('sample.csv') as fp, open('output.csv', 'w',newline='') as fw 中添加newline='' 解决了这个问题
【解决方案2】:

这是一种不同的方法,它使用pandas:

import numpy as np
import pandas as pd

df = pd.read_csv('sample.csv')
files = df['fileName'].unique()

for f in files:
    df = df.merge(pd.read_csv(f), on='id', how='left')

df['message'] = np.where(df['message_x'].isnull(), df['message_y'], df['message_x'])
df.drop(columns=['message_x', 'message_y', 'fileName'], inplace=True)
df.to_csv('output.csv', index=False)

输出:

id  name        contactno.  message
1   robin       1234455     my name is robin. I am from Berlin
2   elsa,roy    42342442    my name is Elsa. My age is 12
3   john        232323

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-01
    • 1970-01-01
    • 2017-02-12
    • 2018-07-24
    • 2022-09-23
    • 2020-01-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多