【问题标题】:getting a specific row of multiple csv's and writing to a new csv获取多个csv的特定行并写入新的csv
【发布时间】:2018-08-15 19:34:15
【问题描述】:

已经进行了很好的搜索,但找不到我要查找的内容。我有许多由 CFD 模拟打印的 csv 文件。我的 python 脚本的目标是:

  • 获取每个csv的最后一行
  • 将行添加到新文件中,并将文件名添加到每行的开头

目前我有

if file.endswith(".csv"):

    with open(file, 'r') as f:
        tsrNum = file.translate(None, '.csv')
        print(tsrNum + ', ' + ', '.join(list(csv.reader(f))[-1]))

它将正确的值打印到终端中,但我必须手动将其粘贴到新文件中。

有人可以帮助完成最后一步吗?我对 python 的语法不够熟悉,当然,一旦我完成了这个 CFD 项目,就在我的待办事项清单上,因为到目前为止,当我设法正确实现它时,这真是太棒了。我尝试使用循环和csv.dictWriter,但收效甚微。

编辑

我无法让发布的解决方案正常工作。这是一个人帮我写的代码

import csv
import os
import glob

# get a list of the input files, all CSVs in current folder
infiles = glob.glob("*.csv")
# open output file
ofile = open('outputFile.csv', "w")
# column names
fieldnames = ['parameter','time', 'cp', 'cd']
# access it as a dictionary for easy access
writer = csv.DictWriter(ofile, fieldnames=fieldnames)
# output file header
writer.writeheader()
# iterate through list of input files
for ifilename in infiles:
    # open input file
    ifile = open(ifilename, "rb+")
    # access it as a dictionary for easy access
    reader = csv.DictReader(ifile)
    # get the rows in reverse order
    rows = list(reader)
    rows.reverse()
    # get the last row
    row = rows[0]
    # output row to output csv
    writer.writerow({'parameter': ifilename.translate(None, '.csv'), 'time': row['time'], 'cp': row['cp'], 'cd': row['cd']})
    # close input file
    ifile.close()

# close output file
ofile.close()

【问题讨论】:

    标签: python csv scripting


    【解决方案1】:

    把你的问题分成小块:

    • 遍历目录
    • 获取最后一行
    • 写入新的 csv。

    我已经尝试过非常冗长,所以你应该尝试做这样的事情:

       import os
    
        def get_last_line_of_this_file(filename):
            with open(filename) as f:
                for line in f:
                    pass
                return line
    
        def get_all_csv_filenames(directory):
            for filename in os.listdir(directory):
                if filename.endswith('.csv'):
                    yield filename
    
        def write_your_new_csv_file(new_filename):
            with open(new_filename, 'w') as writer:
                for filename in get_all_csv_filenames('now the path to your dir'):
                    last_line = get_last_line_of_this_file(filename)
                    writer.write(filename + ' ' + last_line)
    
        if __name__ == '__main__':
            write_your_new_csv_file('your_created_filename.csv')
    

    【讨论】:

    • 在我的下一个项目中,我需要你作为语法检查员:-) 我的意思是代码作为示例,并匆忙编写。不过谢谢,我已经更正了。
    • 我只是复制/粘贴并运行它,没什么特别的。最后一件事,OP似乎想写出一个新的csv文件,但是你在filenamelast_line之间添加了一个空格,不应该是filename + ', ' + last_line吗?
    • 我不知道原始海报的文件应该采用哪种特定格式。我的意思是帮助他解决问题的重组。 Id 并不是要解决这个特殊问题。对他来说,根据自己的需要改变这部分是微不足道的。
    • 我得到了这些。他能够在 csv 中获得正确的值,并抱怨如何为给定目录中的所有 csv 文件实现这一点。我的代码应该足以让他完成工作。他所要做的就是将 csv.reader(f))[-1] 放在正确的位置:-)
    猜你喜欢
    • 2020-06-22
    • 2018-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-10
    相关资源
    最近更新 更多