2010-11-06 10 views
9

Chcę zapisać wynik (contents) do pliku (zapisując go w UTF-8). Plik nie powinien być nadpisywany, powinien być zapisany jako nowy plik - np. file2.txt Tak więc, z pięściami otwieram kod file.txt, koduję go w UTF-8, robię kilka rzeczy, a potem chcę zapisać go pod numerem file2.txt w UTF-8. Jak mam to zrobic?Zapisywanie do pliku .txt (UTF-8), python

import codecs 
def openfile(filename): 
    with codecs.open(filename, encoding="UTF-8") as F: 
     contents = F.read() 
     ... 
+0

"Plik nie powinien być nadpisany". Dlaczego jest tylko jeden otwarty, jeśli czytasz jeden plik i piszesz nowy plik? –

+0

ponieważ jest to niedokończony kod. ... – Gusto

+0

"ponieważ jest to niedokończony kod"? Co? "niedokończone" nie jest dobrym wytłumaczeniem niedopasowania między wymaganiami a kodem. Dlaczego jest tylko jeden otwarty? Popraw swój kod, aby lepiej odpowiadał Twoim wymaganiom. –

Odpowiedz

16

Krótka droga:

file('file2.txt','w').write(file('file.txt').read().encode('utf-8')) 

Długa droga:

data = file('file.txt').read() 
... process data ... 
data = data.encode('utf-8') 
file('file2.txt','w').write(data) 

i przy użyciu 'kodeki' jawnie:

codecs.getwriter('utf-8')(file('/tmp/bla3','w')).write(data) 
+0

plik "file2.txt" po otwarciu w Notatniku nie jest zakodowany w utf-8, prawdopodobnie dlatego, że dekodowałem dane za pomocą kodeków (kodeków importujących) i zapisując je do pliku użyłem innego sposobu, jak sugerowałeś (używając kodowania) metoda). Pytanie, w jaki sposób mogę zakodować go przy użyciu kodeków? – Gusto

+0

@Gusto - Dodałem oddzielną metodę, mimo że jest całkowicie równoważna. Jak widzisz w notatniku, że plik nie jest zakodowany w UTF-8? Notatnik faktycznie dekoduje dla ciebie. – adamk

+0

Widzę to, ponieważ znaki cyrylicy nie są poprawnie wyświetlane, muszę je zdekodować ręcznie za pomocą kodera notatnika. P.S. Korzystanie z Notepad ++ – Gusto

9

Chciałbym rozdzielić wątpliwości w takich sytuacjach - myślę, że to naprawdę sprawia, że ​​kod jest czystszy, łatwiejszy w utrzymaniu i może być bardziej wydajny.

Masz 3 problemy: odczytanie pliku UTF-8, przetworzenie linii i zapisanie pliku UTF-8. Zakładając, że przetwarzanie jest oparte na linii, działa to doskonale w języku Python, ponieważ otwieranie i iterowanie po liniach pliku jest wbudowane w język. Oprócz tego, że jest bardziej przejrzysty, jest to również bardziej efektywne, ponieważ umożliwia przetwarzanie dużych plików, które nie mieszczą się w pamięci. Na koniec daje świetny sposób na przetestowanie kodu - ponieważ przetwarzanie jest oddzielone od pliku io, pozwala pisać testy jednostkowe, a nawet po prostu uruchamiać kod przetwarzania na przykładowym tekście i ręcznie przeglądać wyniki bez błądzenia się plikami.

Konwertuję linie na duże litery dla celów przykładu - prawdopodobnie przetwarzanie będzie bardziej interesujące. Lubię używać tutaj wydajność - to ułatwia przetwarzanie, aby usunąć lub wstawić dodatkowe linie, chociaż nie jest to używane w moim trywialnym przykładzie.

def process(lines): 
    for line in lines: 
     yield line.upper() 

with codecs.open(file1, 'r', 'utf-8') as infile: 
    with codecs.open(file2, 'w', 'utf-8') as outfile: 
     for line in process(infile): 
      outfile.write(line)