Python записывает новую строку в файл, а не перевод новой строки - PullRequest
1 голос
/ 01 марта 2012

Вот общий код для взятия текстового файла с разделителями табуляции и создания нового файла, который принимает только первые два значения.

    fin = open("in.txt", 'r')
    fout = open("out.txt", 'w')

    for line in fin:

        mrList = line.split('\t')
        fout.write(mrList[0] + "\t" + mrList[1])
        fout.write('\n')

    fin.close()
    fout.close()

Когда это входит:

Hello world<tab>how are you?<tab>Groovy
Like pie?<tab>I love it<tab>omnomnom
Go pikachu!<tab>Use pound!<tab>She like

Это выходит:

Hello world<tab>how are you?਍䰀椀欀攀 瀀椀攀㼀ऀ䤀 氀漀瘀攀 椀琀ഀ
Go pikachu!<tab>Use pound!਍

Я подозреваю, что '\ n' не совсем новая строка, и поиск в Google настаивает на "определенно \ n 0_0"

UPDATE:

Поскольку ответ ниже, (спасибо!) Обнаружил, что в командной строке Linux:

file peskyInputFile.txt

Сообщает вам кодировку, и что

iconv -c -f utf-16 -t utf-8 peskyInputFile.txt -o outputFile.txt

преобразует файл UTF-16 в UTF-8, что позволяет избежать хлопот, если вам не нужно иметь дело с UTF16

1 Ответ

4 голосов
/ 01 марта 2012

Файл закодирован в UTF-16, и вы пытаетесь обработать его как ASCII. Когда вы удаляете символ новой строки, вы потребляете только один байт, поэтому UTF-16 отключается на единицу до следующего символа новой строки. См. « Python считает, что текстовый файл из 3000 строк имеет длину в одну строку? » для решения и объяснения.

Это то, что вы делаете:

>>> b = u'Like pie?\tI love it\tomnomnom'.encode('utf-16le')
>>> s = ('\n' + b + '\0').decode('utf-16le')
>>> print s
䰊椀欀攀 瀀椀攀㼀ऀ䤀 氀漀瘀攀 椀琀ऀ漀洀渀漀洀渀漀洀
...