2010-10-26 41 views
9

Tôi đang viết một chuỗi câu lệnh SQL cho một tệp bằng python. Mẫu chuỗi trông giống như:Tập tin Python.write tạo trả về vận chuyển bổ sung

store_insert = '\tinsert stores (storenum, ...) values (\'%s\', ...)' 

Tôi đang viết đến tập tin như vậy:

for line in source: 
    line = line.rstrip() 
    fields = line.split('\t') 
    script.write(store_insert % tuple(fields)) 
    script.write(os.linesep) 

Tuy nhiên, trong kết quả đầu ra, tôi thấy \ r \ r \ n vào cuối mỗi dòng, thay vì \ r \ n như tôi mong đợi. Tại sao?

+1

'%' định dạng chuỗi giờ đây đã cũ; thành ngữ ưu tiên là 'str.format' =) – katrielalex

+4

Bạn có mở tệp ở chế độ văn bản hoặc nhị phân không? Bạn đang sử dụng hệ điều hành nào? – AndiDog

+0

Windows và tôi chỉ mở một tệp (tệp, 'r') – Chris

Trả lời

20

\n được chuyển đổi thành os.linesep cho các tệp được mở ở chế độ văn bản. Vì vậy, khi bạn viết os.linesep vào tệp chế độ văn bản trên Windows, bạn viết \r\n\n được chuyển đổi sẽ dẫn đến \r\r\n.

Xem thêm the docs:

Không sử dụng os.linesep như một dòng terminator khi ghi tập tin mở trong chế độ văn bản (mặc định); chỉ sử dụng một '\ n' trên tất cả các nền tảng.

+0

+1 cũng được tìm thấy! Điều này không thực sự xảy ra với tôi (Win7), có lẽ đó là một điều phụ thuộc vào Windows? – katrielalex

+0

Tôi cũng đang sử dụng Windows 7, nhưng điều đó giải thích nó. 1 và trả lời! – Chris

0

thấy open() doc:

Ngoài các tiêu chuẩn fopen() giá trị chế độ có thể 'U' hoặc 'RU'. Python thường được xây dựng với hỗ trợ dòng mới phổ quát; cung cấp 'U' mở tệp dưới dạng tệp văn bản, nhưng các dòng có thể bị chấm dứt bởi bất kỳ điều nào sau đây: quy ước cuối dòng Unix '\ n', quy ước Macintosh '\ r' hoặc quy ước Windows '\ r \ n '. Tất cả các biểu diễn bên ngoài này được xem là '\ n' bởi chương trình Python. Nếu Python được xây dựng mà không có hỗ trợ dòng mới, một chế độ có 'U' giống như chế độ văn bản bình thường. Lưu ý rằng các đối tượng tệp được mở cũng có một thuộc tính được gọi là các dòng mới có giá trị là Không (nếu không có dòng mới nào được nhìn thấy), '\ n', '\ r', '\ r \ n' hoặc một tuple chứa tất cả các loại dòng mới được nhìn thấy.

+0

Vì vậy, những gì? Chế độ dòng mới phổ quát chỉ dành cho việc đọc. – AndiDog

+0

@AndiDog: tôi nghĩ rằng những gì anh ta nói là khi anh ta mở một tập tin mở ('', 'r') sau khi anh ta viết nó, anh ta thấy \ r \ r \ n và anh ta nghĩ rằng anh ta chỉ viết ' \ r \ n '(cửa sổ), vì vậy tôi đã nói với anh ấy rằng khi anh ấy mở tập tin của mình mở() sẽ tự động thêm \ r \ n vào dữ liệu của anh ấy, vì vậy' \ r \ n '+' \ r \ n '=' \ r \ r \ n ',' \ n 'bị xóa, bạn có muốn tôi xây dựng thêm ??? – mouad

+1

Không, tôi thực sự đang sử dụng một tệp đầu ra riêng biệt được mở bằng tệp (mở, 'w'). Thay đổi để mở (tập tin, 'wb') cố định vấn đề, nhưng tôi không hoàn toàn chắc chắn tôi hiểu lý do tại sao – Chris

1

trình cho tôi:

>>> import tempfile 
>>> tmp = tempfile.TemporaryFile(mode="w+") 
>>> store_insert = '\tinsert stores (storenum, ...) values (\'%s\', ...)' 
>>> lines = ["foo\t\t"] 
>>> for line in lines: 
...  line = line.rstrip() 
...  fields = line.split("\t") 
...  tmp.write(store_insert % tuple(fields)) 
...  tmp.write(os.linesep) 
... 
>>> tmp.seek(0) 
>>> tmp.read() 
"\tinsert stores (storenum, ...) values ('foo', ...)\r\n" 

Bạn có chắc chắn đây là mã đang chạy, mà os.linesep là những gì bạn nghĩ rằng đó là, vv?

3

Tệp văn bản có đuôi dòng khác nhau trên các hệ điều hành khác nhau, nhưng thật thuận tiện khi làm việc với các chuỗi có ký tự kết thúc dòng nhất quán. Python kế thừa quy ước từ C bằng cách sử dụng '\n' làm dòng ký tự kết thúc phổ quát và dựa vào chức năng đọc và ghi tệp để thực hiện chuyển đổi, nếu cần. Các chức năng đọc và ghi biết để thực hiện việc này nếu tệp được mở ở chế độ mặc định text. Nếu bạn thêm ký tự b vào chuỗi chế độ khi mở tệp, bản dịch này bị bỏ qua.

3

Với Python 3

os.open() giới thiệu các tham số mới newline cho phép để xác định một chuỗi mà bất kỳ xảy ra \n sẽ được dịch sang.

Chuyển đối số chuỗi trống newline='' vô hiệu hóa bản dịch, để lại dòng mới như cũ. Chỉ hợp lệ cho chế độ văn bản.

From the documentation

Mở đầu ra, nếu xuống dòng là Không, bất kỳ 'n \' chữ viết là dịch sang tách dòng mặc định hệ thống, os.linesep. Nếu dòng mới là '', không có bản dịch nào diễn ra. Nếu dòng mới là bất kỳ giá trị pháp lý nào khác trong số , bất kỳ ký tự '\ n' nào được viết đều được dịch sang số chuỗi đã cho.

+0

Đối với trường hợp sử dụng và một số công cụ xây dựng, hãy xem [tại đây] (http://stackoverflow.com/questions/43528959/python-3-how-to-pass-binary-file-as-text-without-saving-first) – RolfBly

Các vấn đề liên quan