为什么python用中文写出来?

时间:2017-03-15 10:52:14

标签: python fasta

这是我关于Stack Overflow的第一个问题,所以如果我的问题格式不正确,我想先道歉。我对编码没有特别的经验,但我正在努力解决我的工作中的特定问题。

我正在尝试替换大型fasta文件的标头(用于对齐DNA序列)。我有一个包含fasta alignment(alignment.txt)的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文件中的标题(以#39;>'开头的行)。

我有一个包含以下内容的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
䄊䝔䝇䝔䝃䝁䝁䝃䍔䝁䅔呔䅁呇䝇䝇䅇䅁呁䅔䅇䝔䅃䝔䝇䝁䅁䅁呔....

'线'正在从罗马字符改为汉字。它不应该是汉字,我不能为我的生活而努力,为什么会发生这种情况!

当' line'打印到控制台,它正确打印。即。

ATGGGTGCGAGAGCGTCAGTATTAAGTGGGGGAAAATTAGATGCGTGGGAGAA....

所以我认为它必须与它的写作方式有关。

如果有人能够帮助我或提供一些见解,我将不胜感激,谢谢。

[编辑:现在解决了。见下文。谢谢大家!]

2 个答案:

答案 0 :(得分:0)

似乎Python支持"编码" open()函数中的参数覆盖默认编码格式。如果您知道输入和输出文件的正确编码是什么,您应该能够通过添加如下内容来更正它(在您的情况下将实际编码替换为正确的编码):

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

PS:似乎问题是由于Python 3默认使用Unicode进行文本文件I / O,这是对Python 2.x的更改。

答案 1 :(得分:0)

感谢各位的帮助。它现在已经解决了(基本上我是个白痴)......

我如何解决它:

  1. 已安装python3
  2. 将两个.txt文件重新保存为带有Unix(LF)换行符的Unicode UTF-8。
  3. 在脚本开头将“#!/ usr / bin / env python”更改为“#!/ usr / bin / env python3”。
  4. 从命令行中运行python3 /Users/Sophie/Desktop/AttemptToRename/replacenames.py。
  5. 它有效!

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