将多个csv文件合并为一个

xyhw6mcr  于 2022-12-06  发布在  其他
关注(0)|答案(4)|浏览(209)

我有大约20个csv文件(所有与标题),我想把他们全部合并成1 csv文件。
在网上查找时,我发现一种方法是使用terminal命令:

cat *.csv > file.csv

这工作得很好,但问题是,由于所有的csv文件都带有标头,这些标头也会被放入csv文件中。
有没有一个终端命令或python脚本,我可以把所有这些csv文件合并成一个,只保留一个标题?
非常感谢

yshpjwxd

yshpjwxd1#

我赞成Awk的解决方案,但由于这个问题明确地询问了Python,这里有一个解决方案。

import csv
import sys

writer = csv.writer(sys.stdout)

firstfile = True
for file in sys.argv[1:]:
    with open(file, 'r') as rawfile:
        reader = csv.reader(rawfile)
        for idx, row in enumerate(reader):
            # enumerate() is zero-based by default; 0 is first line
            if idx == 0 and not firstfile:
                continue
            writer.writerow(row)
    firstfile = False

用法:python script.py first.csv second.csv etc.csv >final.csv
这个简单的脚本并没有真正受益于Python的任何特性,但是如果你需要计算非平凡CSV文件中的字段数(即,带引号的字段可能包含逗号,而不是分隔符),这在Awk中很难,而在Python中很容易(因为csv库已经知道如何处理)。

pkmbmrz7

pkmbmrz72#

您可以使用awk执行此操作:

awk '(NR == 1) || (FNR > 1)' *.csv > file.csv

FNR是指当前文件中的记录号(通常是行号),NR是指总记录号。因此,接受第一个文件的第一行,忽略后续文件的第一行。
这是假设您的所有csv文件都具有相同的列数和相同的顺序。

j8yoct9x

j8yoct9x3#

此命令应该适用于您:
tail -qn +2 *.csv > file.csv
但是,请注意,您需要在每个文件的末尾有一个额外的空行,否则文件将在同一行中连接1, 12, 2,而不是第1行中的1, 1和第2行中的2, 2

jhdbpxl9

jhdbpxl94#

下面的代码对我很有效。

import csv
from datetime import datetime
import glob

Time = datetime.now()
Time = Time.strftime("%Y%B%d""_""%H%M")

inputFiles = [] #[i for i in glob.glob('*.{}'.format(extension))]
for file in glob.glob("*.csv"):
    inputFiles.append(file)
print(inputFiles)

with open("combined" + Time + '.csv', 'xb') as csvfile:
    filewriter = csv.writer(csvfile, delimiter=',',quotechar='|', quoting=csv.QUOTE_MINIMAL)        
outputFile = "combined" + Time + '.csv'

for file in inputFiles:
    f = open(file, "r")  # set f as opening the given csv in the same file location
    reader = csv.reader(f)  # set reader as a readable copy of the csv
    rows = []  # set rows as an empty list
    for (
        row
    ) in (
        reader
    ):  # for every row in reader, try to append a new row in our rows list, and if now, pass
        try:
            with open(outputFile, "a", newline="") as g:
                # create a csv writer
                writer = csv.writer(g)
                # write the account number and the docket to the csv file
                writer.writerow(row)
        except:
            pass

相关问题