【问题标题】:Python CSV writer - writing columns in new csv file up to maximum number of fields in csv filesPython CSV writer - 在新的 csv 文件中写入列,直到 csv 文件中的最大字段数
【发布时间】:2017-08-01 03:05:40
【问题描述】:

我的文件夹中有 200 个 CSV 文件。 我要做的是读取每个文件的第一行并写入新的 csv。 最重要的是,我想写 [file,field1,field2,...fieldn] n 是最大字段数。

import csv
import glob 
list=[]
hel=[]
files=glob.glob('C:/dataset/*.csv')
with open('test.csv', 'w',newline='') as testfile:
    csv_writer = csv.writer(testfile)
    for file in files:
        with open(file, 'r') as infile:
            file=file[file.rfind('\\')+1:]
            file=file.strip('.csv')
            reader = csv.reader(infile)
            headers = next(reader)
            hel.append((len(headers)))
            max(hel)
            lst = [file] + headers
            csv_writer.writerow(lst)

结果表明,200 个文件的最大字段数为 255。 所以在新的csv文件之上,我想写file, field1, field2 ... field 255. 我该怎么做?


import csv
import glob 
list=[]
hel=[]
files=glob.glob('C:/dataset/*.csv')
with open('test.csv', 'w',newline='') as testfile:
    csv_writer = csv.writer(testfile)
    for file in files:
        with open(file, 'r') as infile:
            file=file[file.rfind('\\')+1:]
            file=file.strip('.csv')
            reader = csv.reader(infile)
            headers = next(reader)
            hel.append((len(headers)))
            b=['field{}'.format(i) for i in range(1,max(hel)+1)]
            lst = [file] + headers
            csv_writer.writerow(lst)

现在b 是这样的列表 ['field1','field2'...'field255'] 我需要在 'field1' 之前插入 'file' 并将该行写在新 csv 文件的顶部。在csv_writer.writerow(lst) 之后编写代码会给我一个带有'field1','field2'.. 的csv 文件,每隔一行。我该如何解决这个问题

【问题讨论】:

  • 获取没有父目录路径的文件名,使用os.basename,使用os.splitext将文件名拆分为主要部分和扩展部分。你应该写file = os.path.splitext(os.path.basename(file))[0]
  • 你知道程序执行前的最大字段吗?还是要确定程序中的字段数?
  • @frogcoder 通过执行hel.append((len(headers))),程序知道文件夹中所有文件的最大字段数。在这种情况下,它是 255。使用该数字,我想在我的 csv 文件的开头写入` ['file','field1','field2',...'field255'] `。当一个包含 300 个字段的文件进入我的文件夹时,新的 csv 文件中应该有最多 300 个字段。

标签: python csv field


【解决方案1】:

您首先需要读取所有输入文件以确定最大字段数为 255。然后您需要构造一个字段名称列表以写入输出文件(只需一次,而不是循环):

['field{}'.format(i) for i in range(1, 256)]

您可以将该列表传递给csv 模块来编写它。

【讨论】:

  • 谢谢。根据您的回答,我编辑了我的问题。在我的代码中,我应该在哪里使用 csv 在 csv 文件的顶部写入该列表。 (第一行)
  • @김도훈:只需调用一次writerow(),而不是在for file in files: 循环中。这将使它写入一次,而不是多次。
  • 然后writerow()with open('test.csv', 'w',newline='') as testfile : 循环中?这不是在csv文件末尾写行吗?
  • @김도훈:试试看。
  • 是的。它确实写在 csv 文件的底部。
【解决方案2】:

在写入文件之前读取每个文件的字段计数和第一行。

import glob
from itertools import chain
import os
from os.path import splitext, basename

def first_line(filepath):
    with open(filepath) as f:
        return next(f)


def write_test_file(dest_file_path, source_path_name):
    source_paths = glob.glob(source_path_name)
    first_lines = list(map(first_line, source_paths))

    max_count = max(l.count(",") for l in first_lines)
    field_names = map("field{}".format, range(1, max_count + 2))
    header = ",".join(chain(["file"], field_names)) + os.linesep

    file_names = (splitext(basename(p))[0] for p in source_paths)
    content = chain([header], map(",".join, zip(file_names, first_lines)))

    with open(dest_file_path, 'w') as testfile:
        testfile.write("".join(content))


write_test_file('test.csv', 'C:/dataset/*.csv')

【讨论】:

  • 现在它确实在 csv 文件顶部写入 ['file','field1','field2'..] 但从文件中,我认为它正在读取其他行,因为里面有实际值,这很奇怪。
  • @김도훈 对不起,我不明白这个问题。结果头有问题吗?
  • 结果头没问题。它成功写入['file','field1',..] 但下面与我从代码中得到的不同。我的代码从 csv 文件中读取第一行,这些文件主要是字段名称,但是当我尝试您的代码时,其中有实际值,这意味着它会读取其他行,然后将它们写入新的 csv 文件。
  • @김도훈 我误解了你的问题,我以为你需要每个文件的第一行实际数据,这很容易解决,我会修改代码。
  • 是的。我只需要添加一个新行[file, field1, .. field n]。其他一切都很好。谢谢你的代码。我会试试的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多