2014-02-12 3 views
0

Добрый вечер,Проблемы с обработкой файлов в Python

Я довольно новыми для Python и в данный момент и на данный момент я борюсь с проблемой, как правильно редактировать файл (.txt или. csv) в python. Я пытаюсь написать небольшую программу, которая будет принимать каждую строку текстового файла, зашифровывать его, а затем перезаписывать файл за строкой и сохранять его. Соответствующая часть моего кода выглядит так:

with open('/home/path/file.csv', 'r+') as csvfile: 
    for row in csv.reader(csvfile, delimiter='\t'): 
     y = [] 
     for i in range(0, len(row)): 
      x = encrypt(row[i], password) 
      y.append(x) 
     csvfile.write(''.join(y)) 

Которая при исполнении ничего не делает. Я играл с кодом немного, иногда он впадает в

TypeError: expected a character buffer object 

Функция шифрования возвращает строку, и мой файл состоит из 3-х строк в строку, разделенных на вкладку, как это:

key1 value1 value1' 
key2 value2 value2' 
key3 value3 value3' 
... 

Возможно, csv.reader правильно прочитал файл и возвращает один список в строке, а затем возвращает список с зашифрованными фразами. Однако я не могу заставить функцию file.write() фактически перезаписать файл. Кто-нибудь знает, как обойти это? Любая помощь будет принята с благодарностью.

Спасибо,

Энди

+0

Вы можете просто пропускать 'csvfile.seek (0)', который будет сбросить файл курсор в начало файла перед записью (вы хотите, чтобы сделать все ваше чтение, а затем записать все на конец. Делает ли что-нибудь, если вы пишете содержимое в новый файл? –

ответ

1

Вы имеете открыть файл только для чтения. Вам нужно открыть второй файл для записи.

with open('/home/path/file.csv', 'r+') as csvfile: 
    for row in csv.reader(csvfile, delimiter='\t'): 
     y = [] 
     for i in range(0, len(row)): 
      x = encrypt(row[i], password) 
      y.append(x) 
with open('/home/path/file.csv', 'w') as csvfile: 
    csvfile.write(''.join(y)) 

Я никогда не хотел бы переписывать свои файлы, дисковое пространство дешево.

with open('/home/path/file.csv', 'r+') as csvfile: 
    with open('/home/path/file.enc', 'w') as csvencryptedfile: 
     for row in csv.reader(csvfile, delimiter='\t'): 
      y = [] 
      for i in range(0, len(row)): 
       x = encrypt(row[i], password) 
       y.append(x) 
      csvencryptedfile.write('\t'.join(y)) 
      csvencryptedfile.write('\n') 
+0

А я действительно предполагал, что, поскольку «r +» означает «чтение/запись», мне не нужно открывать второй файл в режиме записи. отлично сейчас, большое спасибо. – andynitrox

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