1

我有一个包含以下字段的电子表格:

id age smoker do sport
1   35  yes    rare
2   40  no     frequently
3   20  no     never 
4   ..  ..     ..

我想创建一个 Python 脚本来编辑这个通过 csv 文件转换传递的电子表格。

“是”变为 1,“否”变为 0,“罕见”变为 0,“经常”变为 1,“从不”变为 2。

我已将电子表格保存为 csv 文件,使用分隔符作为 ';' 和quotechar'“'。

现在我写了这段代码:

import csv
filecsv=open("file.csv","r")
reader=csv.reader(filecsv, delimiter= ';' , quotechar=' " ')
out=open("outfile.csv","w")
output=csv.writer(out, delimiter= ';' , quotechar=' " ')

for row in reader:
    for field in row:
        if row[field]=='yes':
                .
                .
                .
                .

但我不知道如何继续......

有人可以告诉我如何使用 python 进行这些更改吗?

使用 Python 列表或字典更好吗?

谢谢大家!

4

3 回答 3

2

尽管 CSV 文件看起来像电子表格,但它们的核心只是文本文件。这意味着您实际上不需要使用 csv 库,而是将其作为简单字符串读取。

将文件作为字符串后,您可以使用正则表达式来转换相关值。这是一个例子:

import re
o = open("output","w")
data = open("file").read()
o.write( re.sub("someword","newword",data) )
o.close()

请记住,您需要re.sub()为每个要转换的值调用一次。

于 2012-11-13T14:26:08.213 回答
1

看到您对 Python 的csv 库的了解程度,对于输入 csv 的每一行,使用您需要的更改创建一个新行并将其写入一个新的 csv 文件应该是微不足道的。

请注意 csv 阅读器如何将每一行视为一个列表。接下来看csv writer的writerow()方法;它需要一个 python 列表并将其写入 csv 行。您需要做的就是一次读取一行,进行您想要的更改并将其吐回给作者。使用您的代码:

for row in reader: #for each row in the input
    outrow = list(row) # make a copy of the row. I'm not sure if you NEED to do this, but it doesn't hurt.

    if outrow[2] == "yes": #if the value in the 3rd column, "smoker", is "yes"
        outrow[2] = 1 #change it to 1
    elif outrow[2] == "no": #if it's "no"
        outrow[2] = 0 #change it to 0.

    #repeat this process for outrow[3] (meaning column #4, "do sport")

    output.writerow(outrow)

您可能注意到 python 调用第 3 列 2 和第 4 列 3 这是因为 python 从 0 开始计数(所以第 1 列是第 0 列)。您应该能够按照此示例进行所需的所有更改。

完成后不要忘记关闭文件!

于 2012-11-13T14:27:05.340 回答
0

如果您将始终使用该格式并且您想逐行替换:

replacements_dict = {
  'yes': 1,
  'no' : 0,
  'rare': 0,
  'frequently': 1,
  'never': 2
}

for row_list in reader:
   output.writerow([
     row_list[0], 
     row_list[1]
     replacements_dict[row_list[2]],
     replacements_dict[row_list[3]]
    ])

您还可以将您的 csv 作为字符串读入内存,然后替换像 georgesl 建议这样的词

于 2012-11-13T14:25:01.180 回答