Прочтите много файлов csv и запишите их в кодировку utf8 с помощью python

Я использую код python для чтения из многих файлов csv и устанавливаю кодировку в utf8.I встречается проблема, когда я читаю файл, я могу читать все строки, но когда я его пишу, он может писать только одну строку. Пожалуйста, помогите мне проверить мой код, как показано ниже:

def convert_files(files, ascii, to="utf-8"): for name in files: #print ("Convert {0} from {1} to {2}").format(name, ascii, to) with open(name) as f: print(name) count = 0 lineno = 0 #this point I want to write the below text into my each new file at the first line #file_source.write('id;nom;prenom;nom_pere;nom_mere;prenom_pere;prenom_mere;civilite (1=homme 2=f);date_naissance;arrondissement;adresse;ville;code_postal;pays;telephone;email;civilite_demandeur (1=homme 2=f);nom_demandeur;prenom_demandeur;qualite_demandeur;type_acte;nombre_actes\n') for line in f.readlines(): lineno +=1 if lineno == 1 : continue file_source = open(name, mode='w', encoding='utf-8', errors='ignore') #pass #print (line) # start write data to to new file with encode file_source.write(line) #file_source.close #print unicode(line, "cp866").encode("utf-8") csv_files = find_csv_filenames('./csv', ".csv") convert_files(csv_files, "cp866") 

3 Solutions collect form web for “Прочтите много файлов csv и запишите их в кодировку utf8 с помощью python”

Вы открываете файл во время каждой итерации.

 for line in f.readlines(): lineno +=1 if lineno == 1 : continue #move the following line outside of the for block file_source = open(name, mode='w', encoding='utf-8', errors='ignore') 

Если все, что вам нужно, это изменить кодировку символов в файлах, то неважно, что они являются файлами csv, если преобразование не может изменить то, что символы интерпретируются как разделитель, катчар и т. Д.

 def convert(filename, from_encoding, to_encoding): with open(filename, newline='', encoding=from_encoding) as file: data = file.read().encode(to_encoding) with open(filename, 'wb') as outfile: outfile.write(data) for path in csv_files: convert(path, "cp866", "utf-8") 

Добавить параметр errors чтобы изменить способ обработки ошибок кодирования / декодирования.

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

 import os from shutil import copyfileobj from tempfile import NamedTemporaryFile def convert(filename, from_encoding, to_encoding): with open(filename, newline='', encoding=from_encoding) as file: with NamedTemporaryFile('w', encoding=to_encoding, newline='', dir=os.path.dirname(filename)) as tmpfile: copyfileobj(file, tmpfile) tmpfile.delete = False os.replace(tmpfile.name, filename) # rename tmpfile -> filename for path in csv_files: convert(path, "cp866", "utf-8") 

Вы можете сделать это

 def convert_files(files, ascii, to="utf-8"): for name in files: with open(name, 'r+') as f: data = ''.join(f.readlines()) data.decode(ascii).encode(to) f.seek(0) f.write(data) f.truncate() 
  • Опасности sys.setdefaultencoding ('utf-8')
  • Несколько основных вопросов о кодировании, unicode и stdout
  • Как закодировать (utf8mb4) в Python
  • Django: символ не-ASCII
  • Запись CSV-файла с помощью умляутов, вызывающих «кодек UnicodeEncodeError: 'ascii', не может кодировать символ"
  • Как я могу получить все пробелы в UTF-8 в Python?
  • Python - обнаружить кодировку и преобразовать в utf-8
  • Создайте файл csv utf-8 в Python
  • Кодирование темы почты (SMTP) в Python с символами, отличными от ASCII
  • В чем разница между префиксом u и префиксом unicode () в python?
  • Двойной декодирование юникода в python
  • Python - лучший язык программирования в мире.