2015-11-06 56 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... 
相關問題