2017-03-15 26 views
1

這是我的第一個關於Stack Overflow的問題,所以如果我的問題格式不正確,我想首先道歉。我對編碼沒有特別的經驗,但我正在努力解決與我的工作有關的特定問題。爲什麼python用漢字寫出來?

我想替換一個大的fasta文件(用於比對DNA序列)的標題。我有一個包含FASTA對準txt文件(alignment.txt),其具有這樣的內容:

>418035201_b1_168_m12_gag__Assembly_8 
ATGGGTGCGAGAGCGTCAGTATTAAGTGGGGGAAA...... 

>418035201_b1_168_m12_gag__Assembly_19 
ATGGGTGCGAGAGCGTCAGTATTAAGTGGGGGAAA...... 

我也有將含有所需名稱(newheaders.txt),其具有內容這樣的文本文件:

>418035201_pM_s38_B168_m12_gag_c08_M13F_X00_consensus 
>418035201_pM_s38_B168_m12_gag_c19_M13F_X00_consensus 
.... 

我試圖取代頭與在newheaders.txt文件中的新頭的alignment.txt文件(行開始「>」)。

我有以下內容的python腳本:

#!/usr/bin/env python 


fasta= open('alignment.txt','r') 
newnames= open('newheaders.txt','r') 
newfasta= open('newfasta.txt', 'w') 

for line in fasta: 
    if line.startswith('>'): 
     newname= newnames.readline() 
     newfasta.write(newname) 
    else: 
     newfasta.write(line) 
     print line 

fasta.close() 
newnames.close() 
newfasta.close() 

當我運行它,我得到以下的輸出:

>418035201_pM_s38_B168_m12_gag_c08_M13F_X00_consensus 
䄊䝔䝇䝔䝃䝁䝁䝃䍔䝁䅔呔䅁呇䝇䝇䅇䅁呁䅔䅇䝔䅃䝔䝇䅁䅁䅁呔.... 

>418035201_pM_s38_B168_m12_gag_c19_M13F_X00_consensus 
䄊䝔䝇䝔䝃䝁䝁䝃䍔䝁䅔呔䅁呇䝇䝇䅇䅁呁䅔䅇䝔䅃䝔䝇䝁䅁䅁呔.... 

「線」正在從羅馬字符改爲中國字符。它不應該是中文字符,我不能爲我的生活工作,爲什麼發生這種情況!

將'行'打印到控制檯時,它會正確打印。即

所以我相信它一定是寫出來的。

如果有人能夠幫助我或提供一些見解,我將不勝感激,謝謝。

[編輯:現在解決了。見下文。謝謝大家!]

+2

我的猜測是,也許你是解釋文件爲UTF-16,使兩對字節是解釋爲單個字符。 –

+0

代碼在我的系統上運行,直接通過'python2 test.py'直接運行,沒有任何IDE或任何東西。你在使用什麼操作系統? Tobias_k說的有道理,我不明白爲什麼會發生這種情況,除非系統運行UTF-16('/ etc/locale.conf'和'locale-gen'來生成UTF-16)的默認localeconf。如果您正在運行Linux,請在控制檯中向我們提供'locale -a'的輸出。 – Torxed

+0

我在MacOS Sierra 10.12上運行它。我意識到它正在運行python 2.7,所以我剛剛安裝了python3。但是現在,我收到以下錯誤,當我嘗試運行它: 「語法錯誤:無效的語法 >>> /Users/Sophie/Desktop/AttemptToRename/replacenames.py 文件」 」,1號線 /用戶/蘇菲/桌面/ AttemptToRename/replacenames.py ^ 語法錯誤:無效的語法 >>> 「 – Sophie

回答

0

Python似乎支持open()函數中的「encoding」參數來覆蓋默認的編碼格式。只要你知道你的輸入和輸出文件的正確的編碼是,你應該能夠通過添加類似如下(與你的情況正確的參數代替實際的編碼)進行更正:

newnames= open('newheaders.txt','r', encoding='ascii') 
newfasta= open('newfasta.txt', 'w', encoding='utf_8') 

PS :看起來像這個問題是由於Python 3默認使用Unicode來處理文本文件I/O,這是Python 2.x的改變。

+0

我意識到我使用Python 2.7,以便安裝Python 3中,但我現在收到的SyntaxError當我嘗試運行腳本: 「SyntaxError:invalid syntax >>> /Users/Sophie/Desktop/AttemptToRename/replacenames.py File」「,line 1 /Users/Sophie/Desktop/AttemptToRename/replacenames.py ^ 語法錯誤:無效的語法 >>> 「 我現在不能工作了在1號線是什麼無效? – Sophie

0

謝謝大家的幫助。它現在已經解決了(本質上我是一個白癡)...

我如何固定它:

  1. 安裝python3
  2. 重新保存兩個.txt文件爲Unicode UTF-8的Unix( LF)換行符。
  3. 在腳本開始處將「#!/ usr/bin/env python」更改爲「#!/ usr/bin/env python3」。
  4. 從命令行運行python3 /Users/Sophie/Desktop/AttemptToRename/replacenames.py。

它的工作!

我不確定是否所有這些步驟或只有其中一些步驟是必要的,但現在按計劃運行。再次感謝你的幫助。現在就通過並投票! [編輯:顯然我的票不顯示,因爲我有一個低信譽...:/]