CSV文件和Python

CSV文件和Python,python,arrays,file,python-2.7,csv,Python,Arrays,File,Python 2.7,Csv,我正在编写一个Python脚本,它应该合并一些CSV文件的一些列(很多,大约200个文件)。 所有文件看起来像: Timestamp; ...; ...; ...; Value; ... date1;...;...;...; FirstValue;... date2;...;...;...; SecondValue;... 等等 我想从第一个文件中提取时间戳和列值。从其他文件中,我只需要列值 我现在的剧本是: #!/usr/bin/python import csv import os, sy

我正在编写一个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
在数组“column”中,我应该有值。我必须在“provascript.csv”的新列中添加这些值,然后继续对所有文件执行相同的操作。我该怎么做

我想要点像这样的

TimestampFromFirstFile;ValueFromFirstFile;ValueFromSecondFile;ValueFromThirdFile;...
date1;value;value,value;...
date2;value;value;value;...
date3;value;value;value;...
到目前为止还不错。我修复了它(谢谢),但是我不想在第一行读写值,而是想写名字的一部分。而不是有时间戳;价值价值值我更喜欢时间戳;温度1;温度2;存在1;在场2


如何操作?

我应该创建完整的结构,最后将其保存在输出文件中(假设文件在它们之间排序)

一旦我们有了一个有序的列表,就用其他文件来完成它们

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)

我应该创建完整的结构,最后将其保存在输出文件中(假设文件在它们之间排序)

一旦我们有了一个有序的列表,就用其他文件来完成它们

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)

你可以用熊猫来做:

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]


希望这有帮助

你可以用熊猫来做:

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行和3列),以及相应的输出(如果它们不存在,请不要显示
,如果
实际上是一个int,请编写
5
)向我们展示所需输出的示例。您能否提供输入作为最小示例(如3行和3列),以及相应的输出(如果它们不存在,则不显示
,如果
值实际上是一个int,则写入
5
)回溯(最近一次调用):文件“C:/Users/ButoeruG/Desktop/xelena/CsvMerger.py”,第14行,在primofile=csv.reader中(打开(文件'rb'),分隔符=“;”,quotechar=''124;')IOError:[Errno 2]没有这样的文件或目录:'Scheduled_Archive'(20140804-220703)'(服务器'u 1'u TrendLogExtended'u PowerV1FreddaC-Ext).csv'文件列表是由系统生成的dinamic文件。该文件应该存在。我错了吗?可能您的数据文件和python文件不在同一目录中?好的,我错了。现在错误在输出行中的第19行:文件“C:/Users/ButoeruG/Desktop/xelena/prova/CsvMerger.py”中更改。追加([row[2],row[15]])索引器:列表索引超出范围似乎csv primofile没有15行,是吗?请记住索引是零基的。看起来python文件试图将自己作为csv文件打开。我使用glob而不是listdirTraceback解决了这个问题(上次调用):file“C:/Users/ButoeruG/Desktop/xelena/CsvMerger.py“,第14行,在primofile=csv.reader中(打开(文件,'rb'),分隔符=“;”,quotechar='|')IOError:[Errno 2]没有这样的文件或目录:'Scheduled_Archive_u408;20140804-220703)u(服务器1_TrendLogExtended_PowerV1FreddaC-Ext)。csv'文件列表是dinamic的,由系统生成。该文件应该存在。我错了吗?也许你的数据文件和python文件不在同一个目录中?好的,我错了。现在错误发生了变化:文件“C:/Users/ButoeruG/Desktop/xelena/prova/CsvMerger.py”,第19行,在output_rows.append([row[2],row[15]])indexer:list index out out-range似乎csv primofile没有15行,是吗?记住索引是零basedIt看起来python文件正试图将自己作为csv文件打开。我解决了用glob代替listdir的问题