#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]])