1

我想对 csv 文件中的大多数行执行多次编辑,而不对输出 csv 文件进行多次写入。

我有一个 csv,我需要将其转换并清理为特定格式以供另一个程序使用。例如,我想:

  1. 删除所有空白行
  2. 删除列“B”的值不是数字的所有行
  3. 使用这些新数据,创建一个新列并将 B 列中值的第一部分分解到新列中

以下是数据示例:

"A","B","C","D","E"
"apple","blah","1","","0.00"
"ape","12_fun","53","25","1.00"

"aloe","15_001","51","28",2.00"

我可以弄清楚每个进程背后的逻辑,但我想不通的是如何执行每个进程而无需每次都读取和写入文件。我正在使用 CSV 模块。在编写最终的 CSV 之前,有没有更好的方法来一次执行这些步骤?

4

3 回答 3

1

我会定义一组测试和一组流程。

如果所有测试都通过,则应用所有进程,并将最终结果写入输出:

import csv

#
# Row tests
#

def test_notblank(row):
    return any(len(i) for i in row)

def test_bnumeric(row):
    return row[1].isdigit()

def do_tests(row, tests=[test_notblank, test_bnumeric]):
    return all(t(row) for t in tests)

#
# Row processing
#

def process_splitb(row):
    b = row[1].split('.')
    row[1] = b[0]
    row.append(b[1])
    return row

def do_processes(row, processes=[process_splitb]):
    for p in processes:
        row = p(row)
    return row

def main():
    with open("in.csv","rb") as inf, open("out.csv","wb") as outf:
        incsv = csv.reader(inf)
        outcsv = csv.writer(outf)

        outcsv.writerow(incsv.next())    # pass header row
        outcsv.writerows(do_processes(row) for row in incsv if do_tests(row))

if __name__=="__main__":
    main()
于 2012-06-06T01:02:43.850 回答
0

简单的 for 循环。

import csv

csv_file = open('in.csv', 'rb')
csv_reader = csv.reader(csv_file)

header = csv_reader.next()
header.append('F') #add new column

records = [header]

#process records
for record in csv_reader:
    #skip blank records
    if record == []:
        continue
    #make sure column "B" has 2 parts
    try:
        part1, part2 = record[1].split('_')
    except:
        continue
    #make sure part1 is a digit
    if not part1.isdigit():
        continue
    record[1] = part1 #make column B equal part1
    record.append(part2) #add data for the new column F to record
    records.append(record)

new_csv_file = open('out.csv', 'wb')
csv_writer = csv.writer(new_csv_file, quoting=csv.QUOTE_ALL)

for r in records:
    csv_writer.writerow(r)
于 2012-06-06T01:48:00.303 回答
-1

为什么使用 CSV 模块。CSV 由文本行(字符串)组成,您可以使用 Python 字符串功能(split、join、replace、len)来创建结果。

line_cols = line.split(',') 并返回:line = ','.join(line_cols)

于 2012-06-06T00:24:53.400 回答