2012-03-10 16 views

cevap

44

Bu, kullandığınız Python sürümüne bağlıdır. Python 2'de Chris Drappier's answer geçerlidir.

Python 3'te, farklı (ve daha tutarlı) bir öyküde: metin modunda ('r'), Python dosyayı verdiğiniz metin koduna göre ayrıştırır (ya da platform bağımlı varsayılan) ve read() size bir str verecektir. İkili ('rb') modunda, Python, dosyanın karakter olarak makul bir şekilde ayrıştırılabileceğini ve read() öğesinin size bir bytes nesnesi verdiğini varsaymaz. üzerinde metin modu dosyaları için herhangi platformu kullanılabilir Python 3, evrensel satırbaşıyla ('\n' ve platform özgü yeni satır konvansiyonlar arasındaki çeviri onlar hakkında bakım gerekmez) da

, sadece pencereler.

+0

, metin modunda okuma otomatik olarak ne tür bir kodlama olduğunu tespit etmeye çalışın? Kodlamayı algılamak için bir bayt nesnesi ile oldukça zor bir şey olduğunu hayal ediyorum. – MxyL

+1

@Keikoku Herhangi bir meta veri olmadan tek başına bir akışa dayalı kodlamanın algılanması olanaksızdır - ASCII + 'nın parite yerine bilgi için 8. bit'i kullandığı çeşitli kodlamaları düşünün; Hepsi 255 geçerli tek bayt dizileri paylaşır, ancak bunların sadece yarısı (ASCII yarısı) her birinde aynı karakteri temsil eder. Python'un varsayılanı bunu tahmin etmektir, onun oturumda varsayılan bir varsayılan kodlaması, sys.getdefaultencoding() 'şeklinde yazılmıştır. Py3 yüklememde, UTF-8'inde, ancak her zaman böyle bir durumda olmanıza güvenemezsiniz. – lvc

19

:

Windows'ta

, 'b' moduna eklenen ikili modda dosyasını açar, yani 'rb', 'wb' ve 'r + b gibi orada modları vardır '. Python Windows üzerinde metin ve ikili dosyalar arasında bir ayrım yapar; Metin dosyalarındaki satır sonu karakterleri, veriler okunduğunda veya yazıldığında otomatik olarak hafifçe değiştirilir. Dosyadaki bu perde arkası değişiklikleri, ASCII metin dosyaları için iyidir, ancak JPEG veya EXE dosyalarındaki gibi ikili veriler bozulur. Bu tür dosyaları okurken ve yazarken ikili modu kullanmak için çok dikkatli olun. Unix'te, mod için bir 'b' eklemeye zarar vermez, böylece tüm ikili dosyalar için platformdan bağımsız olarak kullanabilirsiniz.

+0

Temel olarak ikili modda satırları okumayı denemek çok daha zor çünkü EOL karakterinin \ n veya \ r \ n veya başka bir şey olduğu garanti edilmiyor mu? Py3 için – MxyL

8

Fark, satır sonu (EOL) işleminin nasıl yapıldığına dayanmaktadır. Farklı işletim sistemleri, Windows'da OS X, \r\n'dan önceki Mac sürümlerinde, Unix, \r'da EOL -'u işaretlemek için farklı karakterler kullanır. Bir dosya metin modunda açıldığında, dosya okunduğunda, Python sadece \n ile dosyadan okunan OS'ye özgü satırsonu karakterinin yerini alır. Ve tam tersi, yani, metin modunda açılmış bir dosyaya \n yazmayı denediğinizde, OS'ye özgü EOL karakterini yazacaktır. OS'nizin varsayılan EOL'unu os.linesep denetleyerek bulabilirsiniz.

Bir dosya ikili modda açıldığında, herhangi bir eşleşme gerçekleşmez. Ne okuyorsun, okuyorsun. Unutmayın, metin modu varsayılan moddur. Dolayısıyla, metin olmayan dosyaları (görüntüler, videolar, vb.) Ele alıyorsanız, dosyayı ikili modda açtığınızdan emin olun, aksi takdirde dosyayı bir bayt (veya) kullanarak tanıtabilirsiniz.

Python ayrıca evrensel bir yeni çizgi moduna sahiptir. Bir dosya bu modda açıldığında, Python \r, \n ve \r\n tüm karakterlerini \n ile eşler.

+0

Bu, hem Python 2 hem de Python 3 için geçerli midir? – Agostino

2

açık bilgi için ve Agostino's comment/question cevap (bana cevap olarak bu belirten ile bu yüzden yorum ayı için yeterli itibar yok ...):

hiçbir satır sonu modifikasyonu, ne metinde olur Python 2'de

ne de ikili mod - daha önce de belirtildiği gibi, Python 2 Chris Drappier's answer'da geçerlidir (bugünlerde bağlantısının 3'e işaret ettiğini lütfen unutmayın.x Python dokümanlar yalnızca Chris' alıntılanan metin Python 2 input and output tutorial den elbette)

Yani hayır, Windows dışı üzerinde Python 2 ile metin modunda bir dosya açılırken herhangi bir satır sonu yaptığı doğru değildir olduğunu modifikasyon:

0 $ python2.7 -c 'f = open("data.txt", "rU"); print f.readlines()' 
['line1\n', 'line2\n', 'line3\n'] 
:

0 $ cat data.txt 
line1 
line2 
line3 
0 $ file data.txt 
data.txt: ASCII text, with CRLF line terminators 
0 $ python2.7 -c 'f = open("data.txt"); print f.readlines()' 
['line1\r\n', 'line2\r\n', 'line3\r\n'] 
0 $ python2.7 -c 'f = open("data.txt", "r"); print f.readlines()' 
['line1\r\n', 'line2\r\n', 'line3\r\n'] 
0 $ python2.7 -c 'f = open("data.txt", "rb"); print f.readlines()' 

tam hat sonu mod sözü gerçekleştirmek yok Python 2, evrensel yeni satır modunda dosyayı açmak için ancak mümkündür

Python 3 günü

, diğer taraftan, platforma özel hat '\ n' metninde bir dosyayı okumaya normalize olsun do biter (evrensel satır mod belirleyici Python 3.x itibariyle kullanım dışı) modu ve '\ n', metin modunda yazarken geçerli platformun varsayılan satır sonuna dönüştürülür (bayt < -> unicode < -> bayt kod çözme/kodlama metin modundayken). Örneğin. Linux'ta bir Dos/Win CRLF satır sonu dosyasının okunması satırın sonunu normalleştirecektir '\ n'.

+0

Python3 açık fonksiyon gerekirse https://docs.python.org/3/library/functions.html#open evrensel yeni satırlar modu nasıl çalıştığını "satır kontroller (sadece metin için geçerli olduğunu kontrol etmek için bir yeni satır parametresi vardır Yok, '', '\ n', '\ r' ve '\ r \ n' olabilir. Aşağıdaki gibi çalışır: Akıştan girdi okurken, satırsonu Yok ise, evrensel yeni satırlar modu "etkin – Davos

İlgili konular