2013-04-01 3 views
2

Кажется, что-то в этой теме уже (How to replace all those Special Characters with white spaces in python?), но я не могу понять эту простую задачу для жизни меня.Удалить специальные символы из csv-файла с помощью python

У меня есть файл .CSV с 75 столбцами и почти 4000 строк. Мне нужно заменить все «специальные символы» ($ # & * ect) на «_» и записать в новый файл. Вот то, что я до сих пор:

import csv 

input = open('C:/Temp/Data.csv', 'rb') 
lines = csv.reader(input) 
output = open('C:/Temp/Data_out1.csv', 'wb') 
writer = csv.writer(output) 

conversion = '-"/.$' 
text = input.read() 
newtext = '_' 
for c in text: 
    newtext += '_' if c in conversion else c 
    writer.writerow(c) 

input.close() 
output.close() 

Все это удается сделать, чтобы написать все, что в выходной файл в виде одного столбца, выпускающее более 65 тысяч строк. Кроме того, специальные символы все еще присутствуют!

Извините за излишний вопрос. Спасибо заранее!

ответ

4

я мог бы сделать что-то вроде

import csv 

with open("special.csv", "rb") as infile, open("repaired.csv", "wb") as outfile: 
    reader = csv.reader(infile) 
    writer = csv.writer(outfile) 
    conversion = set('_"/.$') 
    for row in reader: 
     newrow = [''.join('_' if c in conversion else c for c in entry) for entry in row] 
     writer.writerow(newrow) 

который превращает

$ cat special.csv 
th$s,2.3/,will-be 
fixed.,even.though,maybe 
some,"shoul""dn't",be 

(обратите внимание, что у меня есть цитируемый значение) в

$ cat repaired.csv 
th_s,2_3_,will-be 
fixed_,even_though,maybe 
some,shoul_dn't,be 

Прямо сейчас, ваш код читает во всем тексте в одну большую строку:

text = input.read() 

Начиная с _ характера:

newtext = '_' 

цикл над каждым характером в text:

for c in text: 

Добавить исправленный символ в newtext (очень медленно):

newtext += '_' if c in conversion else c 

А затем написать оригинальный характер, как колонна, к новому CSV (?):

writer.writerow(c) 

.. который вряд ли будет то, что вы хотите. : ^)

+0

Привет, можете ли вы объяснить немного больше о том, как «newrow = ['. .join (' _ ', если c в преобразовании else c для записи c) для записи в строке]' эта строка кода функционирует? – tortuga

4

Это, похоже, не имеет особого отношения к CSV (пока специальные символы не являются разделителями столбцов).

lines = [] 
with open('C:/Temp/Data.csv', 'r') as input: 
    lines = input.readlines() 

conversion = '-"/.$' 
newtext = '_' 
outputLines = [] 
for line in lines: 
    temp = line[:] 
    for c in conversion: 
     temp = temp.replace(c, newtext) 
    outputLines.append(temp) 

with open('C:/Temp/Data_out1.csv', 'w') as output: 
    for line in outputLines: 
     output.write(line + "\n") 
+0

Я думаю, что ваша логика цикла неправильно: это выведет на экран 'LEN (конверсионные)' линии для каждой линии, не так ли? – DSM

+0

@ DSM- Хороший улов, спасибо! Обновлено с помощью fix :) – dckrooney

0

В дополнение к ошибке, отмеченной @ Nisan.H, и действительной точкой, сделанной @dckrooney, что вам может не понадобиться обрабатывать файл особым образом в этом случае только потому, что это файл CSV (но см мой комментарий ниже):

  1. writer.writerow() должен взять последовательность строк, каждая из которых будет выписана через запятую (см here). В вашем случае вы пишете одну строку.
  2. Этот код настроен на чтение с 'C:/Temp/Data.csv 'в два пути - через input и через lines, но он только на самом деле читается от input (поэтому код не имеет отношения к файлу как CSV-файл).
  3. Код добавляет символы в newtext и записывает каждую версию этой переменной. Таким образом, первая версия newtext будет 1 символ долго, вторые 2 символов длиной третий 3-х символов и т.д.

Наконец, учитывая, что CSV файл может иметь кавычки в нем, он может фактически быть необходимым для обработки входного файла, а именно CSV, чтобы избежать замены кавычек, которые вы хотите сохранить, например кат-метки, которые существуют для защиты запятых, которые существуют в полях файла CSV. В этом случае необходимо обработать каждое поле файла CSV отдельно, а затем записать каждую строку в новый CSV-файл.

+0

Фантастический. Это сработало! Спасибо всем за то, что пропустили меня через это. – Jenny

+0

@Jenny: Рад помочь. Если бы я был вами, я был бы склонен отмечать ответ DSM как правильный, поскольку он является самым полным и подробным. Это также спасло бы других людей, видящих этот вопрос, и думал, что на него еще не ответил. – Simon

0

Может попробовать

s = open('myfile.cv','r').read() 

chars = ('$','%','^','*') # etc 
for c in chars: 
    s = '_'.join(s.split(c)) 

out_file = open('myfile_new.cv','w') 
out_file.write(s) 
out_file.close() 
+0

, если вы хотите писать строки по любой причине, то просто выполните 'rows = s.split ('\ n')' после цикла – dermen

Смежные вопросы