我正在研究一个Python脚本,它应该合并一些CSV文件的一些列(很多,大约200个文件)。 所有文件都是:
Timestamp; ...; ...; ...; Value; ...
date1;...;...;...; FirstValue;...
date2;...;...;...; SecondValue;...
等等。
从第一个文件中我想提取时间戳和列Value。从其他文件我只需要列值。
我现在的脚本是:
#!/usr/bin/python
import csv
import os, sys
# Open a file
path = "Z:/myfolder"
dirs = os.listdir( path )
#Conto il numero di file nella cartella
print len(dirs)
#Assegno il nome del primo file
file = dirs[0]
#Apro il primo file per la lettura di timestamp e primo valore (Value)
primofile = csv.reader(open(file, 'rb'), delimiter=";", quotechar='|')
timestamp, firstValue = [], []
#Per ogni riga del primofile
for row in primofile:
#Copio timestamp
timestamp.append(row[2])
#e Value
firstValue.append(row[15])
with open("provacript.csv", 'wb') as f:
writer = csv.writer(f, delimiter=';')
i = 0
while i < len(timestamp):
writer.writerow([timestamp[i]] + [firstValue[i]])
i = i+1
所以在“provascript.csv”中,我有第一个文件的时间戳和第一列我的值。下一步是逐个打开列表“dirs”中的文件,读取“值”列(第15列),将此列保存在数组中并将其写入“provascript.csv”。
我的代码是:
for file in dirs:
data = csv.reader(open(file, 'rb'), delimiter=";", quotechar='|')
column = []
for row in data:
column.append(row[15])
在数组“列”中我应该有值。我必须在“provascript.csv”的新列中添加这些值,然后继续对所有文件执行相同的操作。我怎么能这样做?
我想要像
这样的东西TimestampFromFirstFile;ValueFromFirstFile;ValueFromSecondFile;ValueFromThirdFile;...
date1;value;value,value;...
date2;value;value;value;...
date3;value;value;value;...
到目前为止一切顺利。我修复了它(谢谢),但我没有在第一行读取和写入值,而是想写一部分名称。而不是Timestamp; Value; Value; Value我更喜欢Timestamp; Temperature1; Temperature2; Presence1; Presence2。
我该怎么做?
答案 0 :(得分:3)
我应该创建完整的结构,最后我将它保存在输出文件中(假设文件是在它们之间排序的)
#create the full structure: output_rows
primofile = csv.reader(open(file, 'rb'), delimiter=";", quotechar='|')
output_rows = []
for row in primofile:
output_rows.append([row[2], row[15]])
一旦我们有了一个有序的列表列表,用其他文件完成它们
for file in dirs:
data = csv.reader(open(file, 'rb'), delimiter=";", quotechar='|')
column = []
for idx,row in enumerate(data):
output_rows[idx].append(row[15])
最后将其保存到文件
with open("output.csv", 'wb') as f:
writer = csv.writer(f, delimiter=';')
for row in output_rows:
writer.writerow(row)
答案 1 :(得分:2)
您可以使用Pandas:
file1 = pd.read_csv("file1", index_col=0, sep=";", skipinitialspace=1)
file2 = pd.read_csv("file2", index_col=0, sep=";", skipinitialspace=1)
file3 = pd.read_csv("file3", index_col=0, sep=";", skipinitialspace=1)
在这里,你有很多选择,特别是在阅读你的csv时解析日期。
文件1是:
... ....1 ....2 Value ....3
Timestamp
date1 ... ... ... FirstValue ...
date2 ... ... ... SecondValue ...
f1 = pd.DataFrame(file1.Value)
f2 = pd.DataFrame(file2.Value)
f3 = pd.DataFrame(file3.Value)
f2
Value
Timestamp
date1 AAA
date2 BBB
f3
Value
Timestamp
date1 456
date2 123
然后为递归合并定义一个函数:
def recursive_merge(list_df):
suffixe = range(1,len(list_df)+1)
merged = list_df[0]
for i in range(1,len(list_df)):
merged = merged.merge(list_df[i], left_index=True, right_index=True,
suffixes=('_%s' %suffixe[i-1], '_%s' %suffixe[i]))
if len(list_df)%2 !=0 :
merged.rename(
columns = {'Value':"Value_%s" %suffixe[i]},
inplace = True) # if number of recursive merge is odd
return merged
并致电:
recursive_merge([f1,f2,f3])
输出
Value_1 Value_2 Value_3
Timestamp
date1 FirstValue AAA 456
date2 SecondValue BBB 123
然后您可以使用以下命令轻松编写该数据框:
recursive_merge([f1,f2,f3]).to_csv("output.csv")
当然,如果您有超过3个文件,您可以制作for循环和/或函数来打开文件,最后得到像[f1,f2,f3,...f200]
希望这有帮助