【问题标题】:Python: add column to CSV file based on existing columnPython:根据现有列将列添加到 CSV 文件
【发布时间】:2011-10-05 00:39:59
【问题描述】:

我已经编写了识别和解析我正在寻找的值所需的内容,我需要帮助将一列写入具有解析值的 csv 文件(或新的 csv 文件)。以下是我正在尝试做的一些伪代码/有点现实的 Python 代码:

# Given a CSV file, this function creates a new CSV file with all values parsed
def handleCSVfile(csvfile):
  with open(csvfile, 'rb') as file:
    reader = csv.reader(file, delimiter=',', lineterminator='\n')
    for row in reader:
        for field in row:
          if isWhatIWant(field):
            parsedValue = parse(field)
            # write new column to row containing parsed value

我已经编写了isWhatIWantparse 函数。如果我需要编写一个全新的 csv 文件,那么我不确定如何同时打开并从一个文件读取和写入另一个文件。

【问题讨论】:

    标签: python csv


    【解决方案1】:

    我会这样做。我猜isWhatIWant() 是应该就地替换字段的东西。

    import csv
    
    def handleCSVfile(infilename, outfilename):
        with open(infilename, 'rb') as infile:
            with open(outfilename, 'wb') as outfile:
                reader = csv.reader(infile, lineterminator='\n')
                writer = csv.writer(outfile, lineterminator='\n')
    
                for row in reader:
                    for field_index, field in enumerate(row):
                        if isWhatIWant(field):
                            row[field_index] = parse(field)
                    writer.writerow(row)
    

    这种模式经常出现并导致非常长的行。有时将打开和文件的逻辑分解为不同的函数会很有帮助,如下所示:

    import csv
    
    def load_save_csvfile(infilename, outfilename):
        with open(infilename, 'rb') as infile:
            with open(outfilename, 'wb') as outfile:
                reader = csv.reader(infile, lineterminator='\n')
                writer = csv.writer(outfile, lineterminator='\n')
    
                read_write_csvfile(reader, writer)
    
    def read_write_csvfile(reader, writer)
        for row in reader:
            for field_index, field in enumerate(row):
                if isWhatIWant(field):
                    row[field_index] = parse(field)
            writer.writerow(row)
    

    这将代码模块化,使您可以更轻松地从彼此独立的逻辑更改文件和格式的处理方式。

    其他提示:

    • 不要将变量命名为file,因为这是一个内置函数。当你最不期待的时候,模仿这些名字会咬你。
    • delimiter=',' 是默认值,因此您无需明确指定。

    【讨论】:

    • 这是有道理的。我只是在一方面感到困惑。我的函数parse 只接收它正在寻找的值并返回解析后的值。它不做任何文件处理。 isWhatIWant 只返回真或假,具体取决于该字段是否是我正在寻找的。我不确定如何使用此模型进行此操作....
    • 如果你能给出一个完整的最小例子,包括这些函数的定义(存根定义很好),这会更好。我编写的代码假定isWhatIWant() 返回可以解释为TrueFalse 的内容,并且parse() 将采用一个字段值并返回另一个值。我们可以帮助您理解其中的哪一部分?
    • 没关系,这很好用。唯一的问题是 outfilename 需要 w+b 权限,rwb 无效,这是唯一的问题。否则,这完美无缺。谢谢,
    • 我错了。 “wb”也应该没问题。我要编辑答案。
    猜你喜欢
    • 2021-04-01
    • 2017-03-06
    • 2013-01-18
    • 2014-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-24
    相关资源
    最近更新 更多