2015-11-06 148 views
0

这里我有一个文本文件。我想阅读AdressBeneficiaryBeneficiary Bank, Acc Nbr,Total US$,Date它位于顶部,RUT,BOX。我试着自己编写一些代码,但我无法正确获取所需的信息,而且如果字符长度发生变化,我将无法获得正确的输出。我应该如何做到这一点,以便我能够获得特定字符串中的所有必需信息。如何从文本文件读取特定的兴趣线?

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

Text.txt

2014-11-09 BOX 1531 20140908123456 RUT 21 654321
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
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 

一些代码更改

我做了一些改变,但我仍然不确信,因为我需要提供空间也分裂。

+0

您可以举例说明什么时候它不起作用? –

回答

0

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

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

请注意,find会给出您搜索的项目的第一个字符的索引。

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...