2017-03-15 22 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。

它的工作!

我不确定是否所有这些步骤或只有其中一些步骤是必要的,但现在按计划运行。再次感谢你的帮助。现在就通过并投票! [编辑:显然我的票不显示,因为我有一个低信誉...:/]