我正在尝试将多个csv文件合并为一个,并尝试了多种方法,但我一直在努力。
我从多个csv文件导入数据,然后将它们一起编译成一个csv文件,似乎前几行很好地填充了,但是随后它开始在行之间随机输入变量号的空格,而且它永远不会完成对合并的csv文件的填充,似乎只是不断地向其中添加信息,这对我来说没有意义,因为我正在尝试编译有限数量的数据。
我已经尝试过为该文件编写close语句,但仍然得到相同的结果,我指定的组合式csv文件永远不会停止获取数据,它将在整个文件中随机分布数据-我只需要一个正常编译的csv 。
我的代码中有错误吗?关于为什么我的csv文件具有这种方式,是否有任何解释?
csv_file_list = glob.glob(Dir + '/*.csv') #returns the file list
print (csv_file_list)
with open(Avg_Dir + '.csv','w') as f:
wf = csv.writer(f, delimiter = ',')
print (f)
for files in csv_file_list:
rd = csv.reader(open(files,'r'),delimiter = ',')
for row in rd:
print (row)
wf.writerow(row)
答案 0 :(得分:0)
您的文件是否具有相同的结构?如果不是不一致的话,他们需要具有以下信息才能加入。如果它不是变量,则可以映射数据以生成最终文件。
在您的代码上,这是正确的,但是如果您使用的是类似Unix的操作系统(Linux,MacOS等),则可以简单地使用“ cat”命令来合并文件,但是如果几个具有不同结构的文件,因此python将是完美的。但是对于这种情况,您的代码将需要进行一些修改。
答案 1 :(得分:0)
您的代码对我有用。
或者,您可以按以下方式合并文件:
csv_file_list = glob.glob(Dir + '/*.csv')
with open(Avg_Dir + '.csv','w') as wf:
for file in csv_file_list:
with open(file) as rf:
for line in rf:
if line.strip(): # if line is not empty
if not line.endswith("\n"):
line+="\n"
wf.write(line)
或者,如果文件不是太大,则可以一次读取每个文件。但是在这种情况下,将复制所有空行和标题:
csv_file_list = glob.glob(Dir + '/*.csv')
with open(Avg_Dir + '.csv','w') as wf:
for file in csv_file_list:
with open(file) as rf:
wf.write(rf.read().strip()+"\n")
答案 2 :(得分:0)
考虑一些调整:
with
进行读写过程。这样可以避免close()
个文件对象,而您不需要对read
个对象进行操作。newline=''
中的参数open()
或lineterminator="\n"
中的csv.writer()
参数。请参见former和latter的答案。os.path.join()
来正确连接文件夹和文件路径。此方法与操作系统无关,因此可以使用正斜杠或反斜杠类型说明Windows或Unix计算机。调整后的脚本:
import os
import csv, glob
Dir = r"C:\Path\To\Source"
Avg_Dir = r"C:\Path\To\Destination\Output"
csv_file_list = glob.glob(os.path.join(Dir, '*.csv')) # returns the file list
print (csv_file_list)
with open(Avg_Dir + '.csv', 'w', newline='') as f:
wf = csv.writer(f, lineterminator='\n')
for files in csv_file_list:
with open(files, 'r') as r:
next(r) # SKIP HEADERS
rr = csv.reader(r)
for row in rr:
wf.writerow(row)