如何使用 Python 写入 CSV 文件
How to write into a CSV file with Python
背景:
我有一个 CSV (csv_dump
) 文件,其中包含来自 MySQL table 的数据。我想将一些满足特定条件 (row[1] == condition_1 and row[2] == condition_2
) 的行复制到临时 CSV 文件 (csv_temp
).
代码段:
f_reader = open(csv_dump, 'r')
f_writer = open(csv_temp, 'w')
temp_file = csv.writer(f_writer)
lines_in_csv = csv.reader(f_reader, delimiter=',', skipinitialspace=False)
for row in lines_in_csv:
if row[1] == condition_1 and row[2] == condition_2:
temp_file.writerow(row)
f_reader.close()
f_writer.close()
问题:
如何复制正在读取的行,将其 "as is" 复制到 Python3 的临时文件中?
下面的 Python 脚本似乎可以完成这项工作...但是,话虽如此,您可能应该使用 MySQL 查询直接完成这项工作,而不是重新处理来自中间 CSV 文件。但我想一定有一些很好的理由想要这样做?
mycsv.csv
:
aa,1,2,5
bb,2,3,5
cc,ddd,3,3
hh,,3,1
as,hfd,3,3
readwrite.py
:
import csv
with open('mycsv.csv', 'rb') as infile:
with open('out.csv', 'wb') as outfile:
inreader = csv.reader(infile, delimiter=',', quotechar='"')
outwriter = csv.writer(outfile)
for row in inreader:
if row[2]==row[3]:
outwriter.writerow(row)
out.csv
:
cc,ddd,3,3
as,hfd,3,3
再做一些工作,您可以更改 'csv.writer' 以使用与 'csv.reader' 相同的分隔符和 escape/quote 字符。它与从文件中写出原始行并不完全相同,但我认为它实际上会一样快,因为如果我们能够检查特定字段的值,相关行已经被清楚地解析而没有错误。
test.csv
data1,data2,data3
120,80,200
140,50,210
170,100,250
150,70,300
180,120,280
代码在这里
import csv
with open("test.csv", 'r') as incsvfile:
input_csv = csv.reader(incsvfile, delimiter=',', skipinitialspace=False)
with open('tempfile.csv', 'w', newline='') as outcsvfile:
spamwriter = csv.writer(outcsvfile, delimiter=',', quoting=csv.QUOTE_MINIMAL)
first_row = next(input_csv)
spamwriter.writerow(first_row)
for row in input_csv:
if int(row[1]) != 80 and int(row[2]) != 300:
spamwriter.writerow(row)
输出tempfile.csv
data1,data2,data3
140,50,210
170,100,250
180,120,280
如果你没有标题删除这两行
first_row = next(input_csv)
spamwriter.writerow(first_row)
背景:
我有一个 CSV (csv_dump
) 文件,其中包含来自 MySQL table 的数据。我想将一些满足特定条件 (row[1] == condition_1 and row[2] == condition_2
) 的行复制到临时 CSV 文件 (csv_temp
).
代码段:
f_reader = open(csv_dump, 'r')
f_writer = open(csv_temp, 'w')
temp_file = csv.writer(f_writer)
lines_in_csv = csv.reader(f_reader, delimiter=',', skipinitialspace=False)
for row in lines_in_csv:
if row[1] == condition_1 and row[2] == condition_2:
temp_file.writerow(row)
f_reader.close()
f_writer.close()
问题:
如何复制正在读取的行,将其 "as is" 复制到 Python3 的临时文件中?
下面的 Python 脚本似乎可以完成这项工作...但是,话虽如此,您可能应该使用 MySQL 查询直接完成这项工作,而不是重新处理来自中间 CSV 文件。但我想一定有一些很好的理由想要这样做?
mycsv.csv
:
aa,1,2,5
bb,2,3,5
cc,ddd,3,3
hh,,3,1
as,hfd,3,3
readwrite.py
:
import csv
with open('mycsv.csv', 'rb') as infile:
with open('out.csv', 'wb') as outfile:
inreader = csv.reader(infile, delimiter=',', quotechar='"')
outwriter = csv.writer(outfile)
for row in inreader:
if row[2]==row[3]:
outwriter.writerow(row)
out.csv
:
cc,ddd,3,3
as,hfd,3,3
再做一些工作,您可以更改 'csv.writer' 以使用与 'csv.reader' 相同的分隔符和 escape/quote 字符。它与从文件中写出原始行并不完全相同,但我认为它实际上会一样快,因为如果我们能够检查特定字段的值,相关行已经被清楚地解析而没有错误。
test.csv
data1,data2,data3
120,80,200
140,50,210
170,100,250
150,70,300
180,120,280
代码在这里
import csv
with open("test.csv", 'r') as incsvfile:
input_csv = csv.reader(incsvfile, delimiter=',', skipinitialspace=False)
with open('tempfile.csv', 'w', newline='') as outcsvfile:
spamwriter = csv.writer(outcsvfile, delimiter=',', quoting=csv.QUOTE_MINIMAL)
first_row = next(input_csv)
spamwriter.writerow(first_row)
for row in input_csv:
if int(row[1]) != 80 and int(row[2]) != 300:
spamwriter.writerow(row)
输出tempfile.csv
data1,data2,data3
140,50,210
170,100,250
180,120,280
如果你没有标题删除这两行
first_row = next(input_csv)
spamwriter.writerow(first_row)