如何使用Python内置的.csv写入模块替换列?

1 投票
3 回答
4871 浏览
提问于 2025-04-15 12:22

我需要在一个很大的Excel .csv文件中对某一列的URL进行查找和替换。因为我刚开始自学一种脚本语言,所以我想试着用Python来实现这个解决方案。

我在“替换”这部分遇到了困难。我看过官方的csv模块文档,了解如何使用写入器,但里面的例子对我来说不够清楚(是的,我学得比较慢)。所以,我想问一下:如何用写入器对象遍历csv文件的每一行呢?

另外,提前为我的代码不够优雅道歉,我还在学习中 :)

import csv

csvfile = open("PALTemplateData.csv")
csvout = open("PALTemplateDataOUT.csv")
dialect = csv.Sniffer().sniff(csvfile.read(1024))
csvfile.seek(0)
reader = csv.reader(csvfile, dialect)
writer = csv.writer(csvout, dialect)

total=0;
needchange=0;
changed = 0;
temp = ''
changeList = []

for row in reader:
    total=total+1
    temp = row[len(row)-1]
    if '/?' in temp:
        needchange=needchange+1;
        changeList.append(row.index)

for row in writer:           #this doesn't compile, hence the question
    if row.index in changeList:
        changed=changed+1
        temp = row[len(row)-1]
        temp.replace('/?', '?')
        row[len(row)-1] = temp
        writer.writerow(row)

print('Total URLs:', total)
print('Total URLs to change:', needchange)
print('Total URLs changed:', changed)

3 个回答

0

一旦你把csv文件的数据放进一个大列表里,替换列表中的某一列有个简单的方法,就是先把这个矩阵转置一下,替换掉对应的行,然后再把它转置回来:

mydata = [[1, 'a', 10], [2, 'b', 20], [3, 'c', 30]]

def transpose(matrix):
    return [[matrix[x][y] for x in range(len(matrix))] for y in range(len(matrix[0]))]

transposedData = transpose(mydata)
print transposedData
>>> [[1, 2, 3], ['a', 'b', 'c'], [10, 20, 30]]

editedData = transposedData[:2] + [50,70,90]
print editedData
>>> [[1, 2, 3], ['a', 'b', 'c'], [50, 70, 90]]

mydata = transpose(editedData)
print mydata
>>> [[1, 'a', 50], [2, 'b', 70], [3, 'c', 90]]
1

你只需要一个循环,同时进行读取和写入。如果你的替换操作只影响一行数据,那就不需要对数据进行两次循环。

for row in reader:
  total=total+1
  temp = row[len(row)-1]
  if '/?' in temp:
    temp = row[len(row)-1]
    temp.replace('/?', '?')
    row[len(row)-1] = temp
  writer.writerow(row)

这只是用来说明循环的,替换的代码是否能这样工作我不太确定。

6

你遇到错误的原因是因为写入器没有数据可以处理。你需要给它提供数据——通常来说,你应该有一个列表或者生成器,用来产生要写入的行。

我建议把这两个循环合并在一起,像这样:

for row in reader:
    row[-1] = row[-1].replace('/?', '?')
    writer.writerow(row)

这样一来,你甚至不需要 totalneedchangechangeList 这些变量了。(里面有很多优化的地方,我很遗憾没有时间详细解释,但我会尽量在后面补充这些信息)

撰写回答