CSV文件与Python

1 投票
2 回答
566 浏览
提问于 2025-04-18 16:13

我正在写一个Python脚本,目的是把一些CSV文件中的几列合并起来(大概有200个文件)。

所有的文件看起来都是这样的:

Timestamp; ...; ...; ...; Value; ...
date1;...;...;...; FirstValue;...
date2;...;...;...; SecondValue;...

依此类推。

我想从第一个文件中提取时间戳和“值”这一列。从其他文件中,我只需要“值”这一列。

到目前为止,我的脚本是:

#!/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])

在数组“column”里,我应该有这些值。我需要把这些值添加到“provascript.csv”的新列中,然后继续对所有文件做同样的事情。我该怎么做呢?

我想要的结果是这样的:

TimestampFromFirstFile;ValueFromFirstFile;ValueFromSecondFile;ValueFromThirdFile;...
date1;value;value,value;...
date2;value;value;value;...
date3;value;value;value;...

到目前为止一切都很好。我解决了这个问题(谢谢),但我希望在第一行写入的是名字的一部分,而不是直接读取和写入“值”。我希望得到的格式是:时间戳;温度1;温度2;存在1;存在2,而不是时间戳;值;值;值。

我该怎么做呢?

2 个回答

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] 这样的列表。

希望这对你有帮助。

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)

撰写回答