如何从文本文件中读取特定的兴趣行?

时间:2015-11-06 07:18:52

标签: python python-2.7 parsing text text-parsing

这里我有一个文本文件。我想阅读位于顶部的AdressBeneficiaryBeneficiary BankAcc NbrTotal US$Date RUTBOX。我尝试自己编写一些代码,但我无法正确获取所需信息,而且如果字符长度发生变化,我将无法获得正确的输出。我该怎么做才能获得特定字符串中的所有必需信息。

当我的切片出错时,会出现主要问题。例如:我使用line[31:]作为Acc Nbr。但如果地址改变那么我的切片也会出错

我的Text.txt

2014-11-09 BOX 1531 20140908123456  RUT 21 654321 0123
Girry S.A.  CONTADO
G 5 Y   Serie A
    NO 098765
11 al Rayo 321 - Oqwerty 108 Monteaudio - Gruguay
Pharm   Cosco, Inc - Britania PO Box 43215
Dirección Hot Springs AR 71903 - Estados Unidos
Oescripción Importe
US$
DO 7640183 - 50% of the Production Degree   246,123
Beneficiary Bank: Bankue Heritage (Gruguay) S.A Account Nbr: 1234563 Swift: MANIUYMM
Adress: Tencon 108 Monteaudio, Gruguay.
Beneficiary: Girry SA Acc Nbr: 1234567
Servicios prestados en el exterior, exentos de IVA o IRAE
    Subtotal US$    102,500
Iva US$ ---------------
    Total US$   102,500
I.V.A AL DIA    Fecha de Vencimiento
IMPRENTA IRIS LTDA. - RUT 210161234015 - 0/40987    17/11/2015
CONSTANCIA N9 1234559842 -04/2013   
CONTADO A 000.001/ A 000.050 x 2 VIAS   
QWERTYAS ZXCVBIZADA 
R. U.T. Bamprador   Asdfumldor Final

Fecha   12/12/2014
1º ORIGINAL CLLLTE (Blanco) 2º CASIA AQWERVO (Rosasd)

我的代码:

txt = 'Text.txt'
lines = [line.rstrip('\n') for line in open(txt)]

for line in lines:
    if 'BOX' in line:
        Date = line.split("BOX")[0]
        BOX = line.split('BOX ', 1)[-1].split("RUT")[0]
        RUT = line.split('RUT ',1)[-1]
        print 'Date : ' + Date
        print 'BOX : ' + BOX
        print 'RUT : ' + RUT

    if 'Adress' in line:
        Adress = line[8:]
        print 'Adress : ' + Adress
    if 'NO ' in line:
        Invoice_No = line.split('NO ',1)[-1]
        print 'Invoice_No : ' + Invoice_No
    if 'Swift:' in line:
        Swift = line.split('Swift: ',1)[-1]
        print 'Swift : ' + Swift
    if 'Fecha' in line and '/' in line:
        Invoice_Date = line.split('Fecha   ',1)[-1]
        print 'Invoice_Date : ' + Invoice_Date
    if 'Beneficiary Bank' in line:
        Beneficiary_Bank = line[18:]
        Ben_Acc_Nbr = line.split('Nbr: ', 1)[-1]
        print 'Beneficiary_Bank : ' + Beneficiary_Bank.split("Acc")[0]
        print 'Ben_Acc_Nbr : ' + Ben_Acc_Nbr.split("Swift")[0]
    if 'Beneficiary' in line and 'Beneficiary Bank' not in line:
        Beneficiary = line[13:]
        print 'Beneficiary : ' + Beneficiary.split("Acc")[0]
    if 'Acc Nbr' in line:
        Acc_Nbr = line.split('Nbr: ', 1)[-1]
        print 'Acc_Nbr : ' + Acc_Nbr
    if 'Total US$' in line:
        Total_US = line.split('US$  ', 1)[-1]
        print 'Total_US : ' + Total_US

输出:

Date : 2014-11-09
BOX : 1531 20140908123456
RUT : 21 654321 0123
Invoice_No : 098765
Swift : MANIUYMM
Beneficiary_Bank : Bankue Heritage (Gruguay) S.A
Ben_Acc_Nbr : 1234563
Adress : Tencon 108 Monteaudio, Gruguay.
Beneficiary : Girry SA
Acc_Nbr : 1234567
Total_US : 102,500
Invoice_Date : 12/12/2014

部分代码更改

我做了一些改动,但我仍然不相信,因为我需要在拆分中提供空格。

2 个答案:

答案 0 :(得分:1)

我建议您使用正则表达式来提取所需的信息。它有助于避免计算偏移字符的数量。

import re

with open('C:\Quad.txt') as f:
    for line in f:
        match = re.search(r"Acc Nbr: (.*?)", line)
        if match is not None:
            Acc_Nbr = match.group(1)
            print Acc_Nbr
        # etc...

答案 1 :(得分:0)

您可以搜索以获取它的索引。例如:

if 'Acc Nbr' in line:
    Acc_Nbr = line[line.find("Acc Nbr") + 10:]
    print Acc_Nbr

请注意,find为您提供了搜索项目的第一个字符的索引。