为什么python用汉字书写?

为什么python用汉字书写?,python,fasta,Python,Fasta,这是我关于堆栈溢出的第一个问题,如果我的问题格式不正确,我想首先道歉。我对编码不是特别有经验,但我正在努力解决工作中的一个具体问题 我正在尝试替换一个大的fasta文件的头(用于对齐DNA序列)。我有一个包含fasta对齐方式(alignment.txt)的txt文件,其内容如下: >418035201_b1_168_m12_gag__Assembly_8 ATGGGTGCGAGAGCGTCAGTATTAAGTGGGGGAAA...... >418035201_b1_168_m12

这是我关于堆栈溢出的第一个问题,如果我的问题格式不正确,我想首先道歉。我对编码不是特别有经验,但我正在努力解决工作中的一个具体问题

我正在尝试替换一个大的fasta文件的头(用于对齐DNA序列)。我有一个包含fasta对齐方式(alignment.txt)的txt文件,其内容如下:

>418035201_b1_168_m12_gag__Assembly_8
ATGGGTGCGAGAGCGTCAGTATTAAGTGGGGGAAA......

>418035201_b1_168_m12_gag__Assembly_19
ATGGGTGCGAGAGCGTCAGTATTAAGTGGGGGAAA......
>418035201_pM_s38_B168_m12_gag_c08_M13F_X00_consensus
>418035201_pM_s38_B168_m12_gag_c19_M13F_X00_consensus
....
我还有一个包含所需名称的文本文件(newheaders.txt),其内容如下:

>418035201_b1_168_m12_gag__Assembly_8
ATGGGTGCGAGAGCGTCAGTATTAAGTGGGGGAAA......

>418035201_b1_168_m12_gag__Assembly_19
ATGGGTGCGAGAGCGTCAGTATTAAGTGGGGGAAA......
>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
䄊䝔䝇䝔䝃䝁䝁䝃䍔䝁䅔呔䅁呇䝇䝇䅇䅁呁䅔䅇䝔䅃䝔䝇䝁䅁䅁呔....
“行”正在从罗马字符改为中文字符。它不应该是中文的,我也不知道为什么会发生这种事

当“行”打印到控制台时,它会正确打印。即

ATGGGTGCGAGAGCGTCAGTATTAAGTGGGGGAAAATTAGATGCGTGGGAGAA....
所以我相信这一定与它的写作方式有关

如果有人能在这方面帮助我或提供一些见解,我将不胜感激,谢谢


[编辑:现在已解决。请参见下面。谢谢大家!]

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


PS:问题似乎是由于Python 3默认使用Unicode进行文本文件I/O,这与Python 2.x有所不同。

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


PS:问题似乎是由于Python3在默认情况下对文本文件I/O使用Unicode,这是对Python2.x的更改。

谢谢大家的帮助。现在解决了(本质上我是个白痴)

我是如何修复的:

  • 安装蟒蛇3
  • 使用Unix(LF)换行符将这两个.txt文件重新保存为Unicode UTF-8
  • 将脚本开头的“#!/usr/bin/env python”更改为“#!/usr/bin/env python3”
  • 从命令行运行python3/Users/Sophie/Desktop/attemptorename/replacenames.py
  • 成功了


    我不确定是否所有这些步骤或只是其中的一些步骤都是必要的,但它现在正在按计划工作。再次感谢你的帮助。现在就去投票吧![编辑:显然我的支持票没有显示出来,因为我的声誉很低…:/][/p>谢谢大家的帮助。现在解决了(本质上我是个白痴)

    我是如何修复的:

  • 安装蟒蛇3
  • 使用Unix(LF)换行符将这两个.txt文件重新保存为Unicode UTF-8
  • 将脚本开头的“#!/usr/bin/env python”更改为“#!/usr/bin/env python3”
  • 从命令行运行python3/Users/Sophie/Desktop/attemptorename/replacenames.py
  • 成功了


    我不确定是否所有这些步骤或只是其中的一些步骤都是必要的,但它现在正在按计划工作。再次感谢你的帮助。现在就去投票吧![编辑:显然我的支持票没有显示出来,因为我的声誉很低…:/][/p>我的猜测是,可能您将文件解释为UTF-16,这样两个字节对被解释为一个字符。代码在我的系统上工作,直接通过python2 test.py运行,没有任何IDE或任何东西。你在什么操作系统上运行这个?tobias_k说的有道理,我个人不明白为什么会发生这种情况,除非您的系统运行默认的localeconf UTF-16(
    /etc/locale.conf
    locale gen
    ,以生成该值)。如果您正在运行Linux,请在控制台中为我们提供
    locale-a
    的输出。我正在MacOS Sierra 10.12上运行它。我意识到它是通过Python2.7运行的,所以我刚刚安装了python3。但是现在,当我尝试运行它时,我得到了以下错误:“SyntaxError:invalid syntax>>>/Users/Sophie/Desktop/attemptorename/replacenames.py文件”,第1行/Users/Sophie/Desktop/attemptorename/replacenames.py^ SyntaxError:invalid syntax>>>“我猜您可能正在将该文件解释为UTF-16,代码在我的系统上运行,直接通过python2 test.py运行,没有任何IDE或任何东西。你在什么操作系统上运行这个?tobias_k说的有道理,我个人不明白为什么会发生这种情况,除非您的系统运行默认的localeconf UTF-16(
    /etc/locale.conf
    locale gen
    ,以生成该值)。如果您正在运行Linux,请在控制台中为我们提供
    locale-a
    的输出。我正在MacOS Sierra 10.12上运行它。我意识到它是通过Python2.7运行的,所以我刚刚安装了python3。但是现在,我在尝试运行它时遇到以下错误:“SyntaxError:invalid syntax>>>/Users/Sophie/Desktop/attemptorename/replacenames.py文件”,第1行/Users/Sophie/Desktop/attemptorename/replacenames.py^SyntaxError:invalid syntax>>>”我意识到我在使用Python2.7,所以安装了Python3,但当我尝试运行脚本时,现在收到一个语法错误:“SyntaxError:invalid syntax>>>/Users/Sophie/Desktop/attemptorename/replacenames.py”,第1行/Users/Sophie/Desktop/attemptorename/replacenames.py^SyntaxError:invalid syntax>>>”我现在想不出第1行中什么是无效的?我是真的