【问题标题】:Compare columns in two csv files and write it to another file in python比较两个csv文件中的列并将其写入python中的另一个文件
【发布时间】:2015-01-07 13:12:58
【问题描述】:

我有两个 csv 文件。

文件 1 的文件路径、组、权限如下所示

/path/eds/aws/file1.dat,dp_card,640                                                       
/path/eds/aws/file2.dat,dp_card,600     
/path/edh/vs/file1.dat,dp_card,640    
/pth/edw/de/file1.dat,pdp_card,640      
/pth/edn/de/file1.dat,pdp_card,640

具有目录路径、组、批处理所有者的文件 2,如下所示

/path/eds/aws/,dp_card,dp_batchown    
/path/edh/vs/,dp_card,dp_batchown   
/path/edw/de/,pdp_card,dp_batchown

我想根据 file2 中存在的路径比较两个文件。如果文件 1 中存在路径,我想将文件名、组、权限、路径、组写入另一个文件。

样本输出:

文件 3

/path/eds/aws/file1.dat,dp_card,640,/path/eds/aws/,dp_card
/path/eds/aws/file2.dat,dp_card,600,/path/eds/aws/,dp_card
/path/edh/vs/file1.dat,dp_card,640,/path/edh/vs/,dp_card
/pth/edw/de/file1.dat,pdp_card,640,/path/edw/de/,dp_card

有人可以帮我编写上述代码吗?我从昨天开始尝试。

到目前为止我写的代码。

#!/usr/bin/python

import csv
import os.path

csv_dialect = dict(delimiter=',', quotechar='|')

path = set()
with open('hdfs','rb') as file_a : 
    reader1 = csv.reader(file_a, **csv_dialect)
    next(reader1)
    for row in reader1:
      dirpath = os.path.dirname(row[0])
      #absp = abspath[:-1]
      path.add(dirpath)
      #print(abspath)

with open('file2', 'ab') as file_c:
    writer = csv.writer(file_c, **csv_dialect)
    with open('lake.csv', 'rb') as file_b:    
        reader2 = csv.reader(file_b, **csv_dialect)
        next(reader2)
        for row in reader2: 
            dirpath1 = os.path.dirname(row[0])
            #print(dirpath1)
            if (dirpath1) in path:
                writer.writerow(row)
                #print(row)

【问题讨论】:

  • 到目前为止你尝试过什么?没有人愿意为您创建完整的解决方案。证明您已为解决问题做出了一些努力。
  • 您可以考虑使用pandas module 来完成这项任务。

标签: python csv


【解决方案1】:

Pandas 让这变得非常简单,而且可读性也很高

import pandas as pd
import os.path

df1 = pd.read_csv('file1.txt', header=None, names=['fpath', 'group', 'permission'])
df2 = pd.read_csv('file2.txt', header=None, names=['dpath', 'group', 'owner'])
df1['dpath'] = df1['fpath'].apply(os.path.dirname)
df2['dpath'] = df2['dpath'].apply(os.path.dirname)
df3 = pd.merge(df1, df2, on="dpath", how="inner")
df3[['fpath', 'group_x', 'permission', 'dpath', 'group_y']].to_csv(
    'file3.txt', index=False, header=False)

输出文件3.txt:

/path/eds/aws/file1.dat,dp_card,640,/path/eds/aws,dp_card
/path/eds/aws/file2.dat,dp_card,600,/path/eds/aws,dp_card
/path/edh/vs/file1.dat,dp_card,640,/path/edh/vs,dp_card

【讨论】:

    猜你喜欢
    • 2016-06-29
    • 2019-08-20
    • 2018-11-19
    • 2014-06-08
    • 1970-01-01
    • 2019-10-05
    • 1970-01-01
    • 1970-01-01
    • 2019-11-24
    相关资源
    最近更新 更多