Как заменить столбец, используя встроенный в Python модуль записи .csv? - PullRequest
1 голос
/ 19 июня 2009

Мне нужно найти и заменить (специфично для одного столбца URL) в огромном файле .csv Excel. Поскольку я только начинаю пытаться учить себя языку сценариев, я решил, что попытаюсь реализовать решение на python.

У меня проблемы с "заменой" части решения. Я прочитал официальную документацию модуля csv о том, как использовать писатель, но на самом деле для меня нет достаточно ясного примера (да, я медленно) Итак, теперь вопрос: как перебрать строки файла csv с объектом записи?

p.s. заранее извиняюсь за неуклюжий код, я все еще учусь :) 1007 *

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 ]

6 голосов
/ 19 июня 2009

Причина, по которой вы получаете ошибку, состоит в том, что у автора нет данных для повторения. Вы должны предоставить ему данные - возможно, у вас есть какой-то список или генератор, который производит строки для записи.

Я бы предложил просто объединить две петли, вот так:

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

И с этим вам даже не нужны total, needchange и changeList. (Там есть куча оптимизаций, которые, к сожалению, у меня нет времени объяснять, но я посмотрю, смогу ли я редактировать эту информацию позже)

1 голос
/ 19 июня 2009

У вас должен быть только один цикл, а также чтение и запись одновременно - если ваши замены затрагивают только одну строку за раз, вам не нужно повторять данные дважды.

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)

Это просто для иллюстрации цикла, не уверен, будет ли работать код замены следующим образом.

0 голосов
/ 21 июля 2009

Как только вы поместите свой 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]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...