在csv文件中添加新列并对on记录进行操作

2024-06-06 17:34:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我有4个csv文件名为光伏.csv, 德维尔.csv, 搜索服务.csv,和电子标签.csv. 我在每个文件中有15列和大约2000行。我想在文件的第一个列中添加一个新的名为Var的列。因此,在光伏.csv文件将由PV填写。其他3个文件也是如此。 之后,我想操作所有的文件如下。在

最后,我想合并/加入这4个基于A_ID和B_ID的文件,并将记录写入一个新的csv文件名最终文件.csv. 如有任何建议和帮助,我们将不胜感激。在

<p>PV.csv is as follows:</p>
^{pr2}$

在驻留.csv具体如下:

   
A_ID      B_ID       LO       UP     LO      UP  
103       321        40       250    517     780
103       503        80       125    435     585     
106       264        192      525    682  
107       197        324      492    542     614    

在csv会话具体如下:

   
A_ID      B_ID       LO       UP     LO      UP 
103       321        75       350    370     850     
106       264        92       225    482     608  
107       197        24       92     142    

在已用.csv具体如下:

   
A_ID      B_ID       LO       UP     LO      UP 
103       321        5        35     75
103       503        100      225    333     408      
106       264        102      325    582  
107       197        24       92     142     214    

的第一个输出文件光伏.csv具体如下:

同样,其余三个文件都将用新列填充,列中包含ehrer文件名、驻留时间、会话和已用时间:

   
A_ID    B_ID      Var   LO        UP     LO      UP
103     321       PV    0         402    
103     503       PV    192       225    433     608   
106     264       PV    104       258    334     408
107     197       PV    6         32     113     258 

最终输出文件如下:

在最终文件.csv. 在

   
A_ID    B_ID      Var    LO        UP
103     321       PV     0         402
103     321       Dwel   40        250
103     321       Dwel   251       517
103     321       Dwel   518       780
103     321       Sess   75        350
103     321       Sess   351       370
103     321       Sess   371       850
103     321       Elap   5         35
103     321       Elap   36        75
103     503       PV     192       225
103     503       PV     226       433
103     503       PV     434       608
103     503       Dwel   80        125
103     503       Dwel   126       435
103     503       Dwel   436       585
103     503       Elap   100       225
103     503       Elap   226       333
103     503       Elap   334       408
106     264       PV     104       258
106     264       PV     259       334
106     264       PV     335       408
106     264       Dwel   192       525
106     264       Dwel   526       682
106     264       Sess   92        225
106     264       Sess   226       482
106     264       Sess   483       608
106     264       Elap   102       325
106     264       Elap   326       582
107     197       PV     6         32
107     192       PV     33        113
107     192       PV     114       258
107     192       Dwel   324       492
107     192       Dwel   493       542
107     192       Dwel   543       614
107     192       Sess   24        92
107     192       Sess   93        142
107     192       Elap   24        92
107     192       Elap   93        142
107     192       Elap   143       214

Tags: 文件csvidlo文件名var记录时间
3条回答

对于这些操作有一个标准的库模块 https://docs.python.org/2/library/csv.html#module-csv

无论如何都不是一个完整的答案,但您的全面实施几乎肯定会从那里开始。上面的python文档包括几个可以帮助您入门的工作示例。在

下面的脚本可以帮助您开始:

from collections import defaultdict
from itertools import groupby
import csv

entries = defaultdict(list)
csv_files = [(0, 'PV.csv', 'PV'), (1, 'Dwell.csv', 'Dwel'), (2, 'Session.csv', 'Sess'), (3, 'Elapsed.csv', 'Elap')]

for index, filename, shortname in csv_files:
    f_input = open(filename, 'rb')
    csv_input = csv.reader(f_input)
    header = next(csv_input)

    for row in csv_input:
        row[:] = [col for col in row if col]    
        entries[(row[0], row[1])].append((index, shortname, row[2:]))

    f_input.close()

f_output = open('finalFile.csv', 'wb')
csv_output = csv.writer(f_output)
csv_output.writerow(header[:2] + ['Var'] + header[2:4])

for key in sorted(entries.keys()):
    for k, g in groupby(sorted(entries[key]), key=lambda x: x[1]):
        var_group = list(g)
        if len(var_group[0][2]):
            up = var_group[0][2][0]
            for entry in var_group:
                for pair in zip(*[iter(entry[2])]*2):
                    csv_output.writerow([key[0], key[1], entry[1], up, pair[1]])
                    up = int(pair[1]) + 1

f_output.close()

使用您提供的数据,可以得到以下输出:

^{pr2}$

要使用文件夹中的所有csv文件,可以在脚本顶部添加以下内容:

import os
import glob

csv_files = [(index, file, os.path.splitext(file)[0]) for index, file in enumerate(glob.glob('*.csv'))]

您还应该更改输出文件的位置,否则下次运行脚本时将读取该文件。在

使用Python2.6.6进行测试(我相信这正是OP所使用的)

您应该使用python内置的csv模块。在

要创建最终的csv文件,您可以这样做。通读每个文件,将新列值添加到每一行并将其写入新文件

import csv

with open('finalcsv.csv', 'w') as outcsv:
    writer = csv.writer(outcsv)
    writer.writerow(['a','b','c','etc','Var']) # write final headers

    for filename in ['PV.csv','Dwel.csv','Sess.csv','Elap.csv']:
        with open(filename) as incsv:
            val = filename.split('.csv')[0]
            reader = csv.reader(incsv) # create reader object
            reader.next() # skip the headers

            for row in reader:
                writer.writerow(row+[val])

相关问题 更多 >