【问题标题】:Read multiple csv data files and sort the data into a new csv file读取多个csv数据文件并将数据排序成一个新的csv文件
【发布时间】:2021-02-11 22:54:04
【问题描述】:

我正在尝试读取文件夹中的多个 csv 文件,从每个 csv 文件中提取三列(key_resp.rt、key_resp_4.rt 和 participant)并将这些信息写入一个新的 csv 文件中。我能够在不将结果写入 csv 文件的情况下运行 for 循环。但是使用下面的代码,新的 csv 文件 (sort.csv) 只包含数据字符串的标题,没有真实数据。

我的代码:

import os
import glob
import csv

#path contain the directory of the folder
path = r'C:\Users\Time estimates task\modified psychopy\reading data-2'
extension = 'csv'
os.chdir(path)
csvlist = glob.glob('*.{}'.format(extension))
print(csvlist) #print out the list of csv file names
for file in csvlist:
    with open (file,'r') as csvfile:
        csv_reader=csv.DictReader(csvfile)
#        for line in csv_reader:
#            print (line['participant'])
        with open('sort.csv','w') as sortfile:
            fieldnames=['key_resp.rt','key_resp_4.rt', 'participant']
            csv_writer=csv.DictWriter(sortfile,fieldnames=fieldnames,delimiter=',',extrasaction='ignore')
            csv_writer.writeheader()
            for line in csv_reader:
                csv_writer.writerow(line)

【问题讨论】:

  • 每当您open('sort.csv','w') 时,它都会重写整个文件。您需要向其附加数据(或在处理所有文件时将其保持打开状态)。
  • 我是新手。你介意给我一个附加数据的例子吗 open('sort.csv','w')
  • 它在 open() 文档中,但是有更好的方法 - 请参阅我发布的答案。

标签: python multithreading csv


【解决方案1】:

虽然可以多次打开输出文件并向其中添加数据(通过使用 'a' 的 mode 参数来表示“追加”而不是 "w" 表示正常(过度)写入——请参阅open() 函数文档——在这种情况下,只打开输出文件 一次 并在附加数据时保持原样会不那么尴尬从输入文件中,一个接一个。

这就是我的意思:(注意:没有尝试对数据进行排序,因为您没有指定要如何完成。)

import csv
import glob
import os

path = r'.\_reading data-2'  # Path of directory containing data files.
extension = 'csv'
fieldnames = 'key_resp.rt', 'key_resp_4.rt', 'participant'
output_filename = 'sort.csv'  # Output filename.
output_filepath = os.path.join(path, output_filename)  # Output in same directory.

csvlist = [filename for filename in glob.glob(os.path.join(path, f'*.{extension}'))
            if filename != output_filepath]  # Avoid reading any existing output file.
print(csvlist) # Print out the list of csv file names.

with open(output_filepath, 'w', newline='') as sortfile:
    csv_writer = csv.DictWriter(sortfile, fieldnames=fieldnames, delimiter=',',
                                extrasaction='ignore')
    csv_writer.writeheader()
    for file in csvlist:
        with open(file, 'r', newline='') as csvfile:
            csv_writer.writerows(csv.DictReader(csvfile))

print('Done')

【讨论】:

  • 非常感谢。您的代码运行良好。
  • 我还为 with open() 行使用了 'a' 参数,但输出文件 (sort.csv) 包含两个不同格式的数据循环。你介意给我一个提示吗?
  • 不能肯定,但正如我所说,使用'a' 附加模式会很尴尬。一方面,您只想编写一次标头,而不是每次读取的输入文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-16
  • 2013-07-05
  • 1970-01-01
  • 2023-01-10
  • 1970-01-01
  • 2019-11-08
相关资源
最近更新 更多