Разбор файла .txt для создания выходного файла с разделителями табуляции

MacOS, Python 2.7

Я пытаюсь проанализировать файл .txt и извлечь строки, которые я хочу создать в виде таблицы с разделителями табуляции Мне придется сделать это для многих файлов, но у меня возникают проблемы с выбором некоторых строк.

Ниже приведен пример входного файла:

# Assembly name:  ASM1844v1
# Organism name:  Acinetobacter baumannii ACICU (g-proteobacteria)
# Infraspecific name:  strain=ACICU
# Taxid:          405416
# BioSample:      SAMN02603140
# BioProject:     PRJNA17827
# Submitter:      CNR - National Research Council
# Date:           2008-4-15
# Assembly type:  n/a
# Release type:   major
# Assembly level: Complete Genome
# Genome representation: full
# GenBank assembly accession: GCA_000018445.1
# RefSeq assembly accession: GCF_000018445.1
# RefSeq assembly and GenBank assemblies identical: yes
#
## Assembly-Units:
## GenBank Unit Accession   RefSeq Unit Accession   Assembly-Unit name
## GCA_000018455.1  GCF_000018455.1 Primary Assembly
#
# Ordered by chromosome/plasmid; the chromosomes/plasmids are followed by
# unlocalized scaffolds.
# Unplaced scaffolds are listed at the end.
# RefSeq is equal or derived from GenBank object.
#
# Sequence-Name Sequence-Role   Assigned-Molecule   Assigned-Molecule-Location/Type GenBank-Accn    Relationship    RefSeq-Accn Assembly-Unit   Sequence-Length UCSC-style-name
ANONYMOUS   assembled-molecule  na  Chromosome
CP000863.1  =   NC_010611.1 Primary Assembly    3904116 na
pACICU1 assembled-molecule  pACICU1 Plasmid CP000864.1  =   NC_010605.1 Primary Assembly    28279   na
pACICU2 assembled-molecule  pACICU2 Plasmid CP000865.1  =   NC_010606.1 Primary Assembly    64366   na

И мой код до сих пор выглядит следующим образом, с заголовком, указывающим заголовки столбцов:

# Open the input file for reading 
InFile = open(InFileName, 'r')
#f = open(InFileName, 'r')

# Write the header
Headstring= "GenBank_Assembly_ID    RefSeq_Assembly_ID  Assembly_level  Chromosome Plasmid  Refseq_chromosome   Refseq_plasmid1 Refseq_plasmid2 Refseq_plasmid3 Refseq_plasmid4 Refseq_plasmid5"

# Set up chromosome and plasmid count
ccount = 0
pcount = 0

# Look for corresponding data from each file
with open(InFileName, 'r') as searchfile:
    for line in searchfile:
        if re.search( r': (GCA_[\d\.]+)', line, re.M|re.I):
            GCA = re.search( r': (GCA_[\d\.]+)', line, re.M|re.I)
            print GCA.group(1)
            GCA = GCA.group(1)
        if re.search( r': (GCF_[\d\.]+)', line, re.M|re.I):
            GCF = re.search( r': (GCF_[\d\.]+)', line, re.M|re.I)
            print GCF.group(1)
            GCF = GCF.group(1) 
        if re.search ( r'level: (.+$)', line, re.M|re.I):
            assembly = re.search( r'level: (.+$)', line, re.M|re.I)
            print assembly.group(1)
            assembly = assembly.group(1)
        if "Chromosome" in line:
            ccount += 1
            print ccount
        if "Plasmid" in line:
            pcount += 1
            print pcount



OutputString = "%s\t%s\t%s\t%s\t%s\t" % (GCA, GCF, assembly, ccount, pcount)


OutFile=open(OutFileName, 'w')
OutFile.write(Headstring+'\n'+OutputString)


InFile.close()
OutFile.close()

Основная проблема, с которой я столкнулся, заключается в том, что я хочу извлечь строки NC_010611.1, NC_010605.1 и NC_010606.1 и иметь между ними пробелы в одной строке, чтобы они оказались под заголовками Refseq_chromosome Refseq_plasmid1 и Refseq_plasmid2 соответственно. Но я хочу, чтобы скрипт их искал, только если Assembly = "Chromosome" или "Complete Genome". Я не уверен, как искать строку, только если это условие выполняется.

Я знаю, что регулярное выражение для получения этих строк может быть '= \ t (\ w + ..)', но это насколько я понял.

Я очень новичок в python, поэтому объяснения были бы отличными. Заранее спасибо!

4 голоса | спросил D.Parker 14 Maypm18 2018, 15:28:43

2 ответа


0
Посмотрите на этот пример:Входные данные:Выход:Основные отличия от вашего сценария:Я использую условие ---- +: = 3 =: + ---- для обработки строк «заголовка» (строк, начинающихся с символа хеша) в отличие от «строк таблицы» внизу (строк, фактически содержащих данныедля каждой последовательности).Я использую условие ---- +: = 4 =: + ---- - это условие, которое вы указали в своем вопросеЯ разбил каждую строку таблицы на такие значения, как это ---- +: = 5 =: + ---- .После этого я получаю тип с помощью ---- +: = 6 =: + ---- (это четвертый столбец в данных таблицы) и ---- +: = 7 =: + ---- даетмне седьмая колонка в таблице.
ответил Andriy Makukha 14 Maypm18 2018, 16:30:38
0
Для начала вы можете просто прочитать все данные в фрейм данных pandas.Затем вы могли бы обработать один столбец (независимо от того, что содержит 'NC_010611.1') способом, который является условным для другого столбца.Смотрите примеры здесь: Pandas условное создание столбца серии /dataframe .Вероятно, можно получить то, что вы хотите, за один проход через данные, но может быть легче писать и читать, если вы сделаете 2 прохода через данные.
ответил Jerry Chi 14 Maypm18 2018, 15:39:27

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132