'r' modunda bir metin dosyasını 'rb' modunda ayrıştırmaktan daha kolay ayrıştırmayı ne sağlar? Özellikle metin dosyası ASCII olmayan karakterler içerdiğinde. documentation denR ve rb modunda bir metin dosyasını ayrıştırma arasındaki fark
cevap
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.
, 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
@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
:
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.
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
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.
Bu, hem Python 2 hem de Python 3 için geçerli midir? – Agostino
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'dene 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'.
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
- 1. HTML dosyasını ayrıştırma R
- 2. Entity Framework: Ayrıştırma ve AsNoTracking arasındaki fark
- 3. R içinde glmnet() ve cv.glmnet() arasındaki fark?
- 4. R içinde `=` ve `<-` arasındaki fark nedir?
- 5. ASP.NET WebHooks ve Signal-R Arasındaki Fark
- 6. Bir .rb (Ruby) dosyasını nasıl görüntüleyebilirim?
- 7. Bir yaml dosyasını ayrıştırma
- 8. Fark() arasındaki fark nedir mustache.js
- 9. Dize [] ve [dize] arasındaki fark
- 10. Cassandra'da Paxos ve W + R> = N arasındaki fark nedir?
- 11. Bash'da declare -r` ve `readonly` arasındaki fark nedir?
- 12. arasındaki fark?
- 13. arasındaki fark
- 14. SQLite içinde "Metin" ve "Dize" veri türü arasındaki fark
- 15. dispatch_get_global_queue ve dispatch_queue_create arasındaki fark nedir?
- 16. GCM ve PARSE push iletileri arasındaki fark
- 17. Araçlar arasındaki fark nedir: metin ve android: android
- 18. [köşeli parantez] arasındaki fark ve * yıldız
- 19. Mercurial güncelleme arasındaki fark ve işlemediğinde bloğu
- 20. ServiceProcessInstaller ve ServiceInstaller arasındaki fark
- 21. BackgroundWorker ve System.Threadding.Thread arasındaki fark
- 22. Spesifikasyon ve bir politika arasındaki fark nedir?
- 23. Bir yardımcı ve kısmi arasındaki fark nedir?
- 24. Bir kullanıcı ve rol arasındaki fark nedir?
- 25. bir cmd dosyası ve% %% arasındaki fark nedir?
- 26. Redis ve kafka arasındaki fark
- 27. ASCIIEncoding ve Encoding Arasındaki Fark
- 28. java.util.Scanner ve java.util.Scanner arasındaki fark. *
- 29. UNIX'teki $ @ ve $ * arasındaki fark nedir?
- 30. C++ - (*) arasındaki fark. ve ->?
Bir metin dosyası mı yoksa ikili dosya mı okuyorsunuz? –
Bir metin dosyası. Ama ne olursa olsun, dosyaya bayt akışı olarak veriliyor. – MxyL