Как написать несколько строк в csv python с помощью цикла

#python

Вопрос:

Привет, я использую этот метод для записи csv-файла из csv-файла, который представляет собой хэшированный код, но я получаю только последнюю строку в выводе, как я могу добавить каждую строку в предыдущую?

 import hashlib import csv d = dict() result = () for i in range(0 , 9999) :  n = hashlib.sha256(str(i).encode())  d[n.hexdigest()] = str(i) with open('/Users/MJ-Mac/Desktop/karname.txt') as f:  file = csv.reader(f)  for row in file :  a = row[0]  b = d[row[1]]  result = (a , b)  with open('/Users/MJ-Mac/Desktop/result3.txt', 'w') as f2:  file2 = csv.writer(f2)  file2.writerow(result)  

Комментарии:

1. вместо «w» используйте » a » для добавления

2. @ csv.writer omuthu прекрасно 'w' работает до тех пор, пока существует только один экземпляр csv.writer . Изменение кода таким образом, чтобы был только один экземпляр, более эффективно

3. @Scrapper142 Верно, я пропустил, что писатель является частью цикла, в котором открыто несколько экземпляров

Ответ №1:

Другие ответы предложили заменить 'w' на 'a' , это не обязательно при работе с csv.writer . Это также может привести к увеличению вашего файла при каждом запуске программы.

Вместо повторного открытия и закрытия relut3.txt, держите его открытым и используйте только один writer

 import hashlib import csv d = dict() result = () for i in range(0 , 9999) :  n = hashlib.sha256(str(i).encode())  d[n.hexdigest()] = str(i) with open('/Users/MJ-Mac/Desktop/result3.txt', 'w') as result_file:  result_writer = csv.writer(result_file) # only create this once    with open('/Users/MJ-Mac/Desktop/karname.txt') as f:  file = csv.reader(f)  for row in file :  a = row[0]  b = d[row[1]]  result = (a , b)   result_writer.writerow(result) # use the already created writer  

Ответ №2:

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

 import hashlib import csv d = dict() result = () for i in range(0 , 9999) :  n = hashlib.sha256(str(i).encode())  d[n.hexdigest()] = str(i) with open('/Users/MJ-Mac/Desktop/karname.txt') as f:  file = csv.reader(f)  for row in file :  a = row[0]  b = d[row[1]]  result = (a , b)  with open('/Users/MJ-Mac/Desktop/result3.txt', 'a') as f2:  file2 = csv.writer(f2)  file2.writerow(result)  

Возможно, было бы лучше открыть файл, а затем записать в него все:

 import hashlib import csv d = dict() result = () for i in range(0 , 9999) :  n = hashlib.sha256(str(i).encode())  d[n.hexdigest()] = str(i) with open('/Users/MJ-Mac/Desktop/karname.txt') as f:  file = csv.reader(f)  with open('/Users/MJ-Mac/Desktop/result3.txt', 'w') as f2:  file2 = csv.writer(f2)  for row in file :  a = row[0]  b = d[row[1]]  result = (a , b)    file2.writerow(result)  

Ответ №3:

Я не могу запустить это сам, так как ваши данные не включены.

Однако я думаю, что ваша проблема в том, что with open('/Users/MJ-Mac/Desktop/result3.txt', 'w') у вас есть флаг «w», который означает «запись», поэтому ваши данные перезаписываются, вместо этого вам может понадобиться флаг «a» для «добавления», чтобы каждая строка добавлялась к экспортируемым данным.

 import hashlib import csv d = dict() result = () for i in range(0 , 9999) :  n = hashlib.sha256(str(i).encode())  d[n.hexdigest()] = str(i) with open('/Users/MJ-Mac/Desktop/karname.txt') as f:  file = csv.reader(f)  for row in file :  a = row[0]  b = d[row[1]]  result = (a , b)  with open('/Users/MJ-Mac/Desktop/result3.txt', 'a') as f2:  file2 = csv.writer(f2)  file2.writerow(result)   

Ответ №4:

Проще и удобочитаемее открывать как входные, так и выходные файлы одновременно и инициализировать средство чтения и записи CSV в начале:

 with open('/Users/MJ-Mac/Desktop/karname.txt') as in_file, open('/Users/MJ-Mac/Desktop/result3.txt', 'w') as out_file:  output = csv.writer(out_file)  for row in csv.reader(in_file):  output.writerow([row[0], d[row[1]])