简体   繁体   English

Python 从txt文件中逐行加入

[英]Python join line by key from txt file

Hi I want to join line in txt file by Key in python, tried to get the 1st line with 'H' and join 'L' with the S820098509 in the 1st set of data for example.嗨,我想通过 python 中的键在 txt 文件中加入行,例如,尝试在第一组数据中使用“H”获取第一行并将“L”与 S820098509 加入。

I have the following我有以下

H,REPPTY,S820098509,C,S,909688,820001,20181023,20181108,20181205,"FOB CNNGB AUSYD        ",PLANOGRAM PO,N,,,
L,REPPTY,S820098509,0007,RCM4PCDUOTBLK,347,,,,20181108,20181205,7.8,AUD,A5381060,SET,1
L,REPPTY,S820098509,0018,RCMRBRRNRGRY,246,,,,20181108,20181205,5.1,AUD,A5381079,EACH,1
L,REPPTY,S820098509,0020,RCM2PCRAWGRY,246,,,,20181108,20181205,2.8,AUD,A5381083,SET,1
H,REPPTY,S820098691,C,O,909357,820001,20181029,20181114,20181211,"FOB CNNGB AUSYD        ",,N,,,
L,REPPTY,S820098691,0062,6PK1300RB,24,,,,20181114,20181211,2.32,AUD,A9437132,EACH,1
H,REPPTY,S820098695,C,O,909513,820001,20181029,20181114,20181211,"FOB CNSHA AUSYD        ",,N,,,
L,REPPTY,S820098695,0004,MTAP50EL5,226,,,,20181114,20181211,21.4,AUD,A5349617,EACH,1
L,REPPTY,S820098695,0005,MTAP50AL1,344,,,,20181114,20181211,3.3,AUD,A5349618,EACH,1
H,REPPTY,S820098704,C,O,909903,820001,20181029,20181114,20181211,"FOB CNSHA AUSYD        ",,N,,,
L,REPPTY,S820098704,0004,JTE229,32,,,,20181114,20181211,4.07,AUD,A9404146,EACH,1
L,REPPTY,S820098704,0040,JBJ7513,33,,,,20181114,20181211,5.38,AUD,A9430524,EACH,1
H,REPPTY,S820098742,C,O,909613,820001,20181029,20181114,20181211,"FOB CNTAO AUSYD        ",,N,,,
L,REPPTY,S820098742,0030,DF7475S,70,,,,20181114,20181211,23.52,AUD,A9485074,EACH,1
H,REPPTY,S820098875,C,O,909520,820001,20181101,20181120,20181217,"FOB CNSHA AUSYD        ",,N,,,
L,REPPTY,S820098875,0052,RST158,72,,,,20181120,20181217,1.69,AUD,A9417626,EACH,36
L,REPPTY,S820098875,0055,RST176,36,,,,20181120,20181217,3.63,AUD,A9445084,EACH,36
H,REPPTY,S820099023,C,O,909352,820001,20181102,20181120,20181217,"FOB CNTAO AUSYD        ",,N,,,
L,REPPTY,S820099023,0072,DB1940TS,15,,,,20181120,20181217,11.77,AUD,A9447563,SET,5

I want to join them to look like this.我想和他们一起看起来像这样。

REPPTY,S820098509,C,S,909688,820001,20181023,20181108,20181205,"FOB CNNGB AUSYD        ",PLANOGRAM PO,N,,,0007,RCM4PCDUOTBLK,347,,,,20181108,20181205,7.8,AUD,A5381060,SET,1
REPPTY,S820098509,C,S,909688,820001,20181023,20181108,20181205,"FOB CNNGB AUSYD        ",PLANOGRAM PO,N,,,0018,RCMRBRRNRGRY,246,,,,20181108,20181205,5.1,AUD,A5381079,EACH,1
REPPTY,S820098509,C,S,909688,820001,20181023,20181108,20181205,"FOB CNNGB AUSYD        ",PLANOGRAM PO,N,,,S820098509,0020,RCM2PCRAWGRY,246,,,,20181108,20181205,2.8,AUD,A5381083,SET,1
REPPTY,S820098691,C,O,909357,820001,20181029,20181114,20181211,"FOB CNNGB AUSYD        ",,N,,,0062,6PK1300RB,24,,,,20181114,20181211,2.32,AUD,A9437132,EACH,1
REPPTY,S820098695,C,O,909513,820001,20181029,20181114,20181211,"FOB CNSHA AUSYD        ",,N,,,0004,MTAP50EL5,226,,,,20181114,20181211,21.4,AUD,A5349617,EACH,1
REPPTY,S820098695,C,O,909513,820001,20181029,20181114,20181211,"FOB CNSHA AUSYD        ",,N,,,0005,MTAP50AL1,344,,,,20181114,20181211,3.3,AUD,A5349618,EACH,1
REPPTY,S820098704,C,O,909903,820001,20181029,20181114,20181211,"FOB CNSHA AUSYD        ",,N,,,0004,JTE229,32,,,,20181114,20181211,4.07,AUD,A9404146,EACH,1
REPPTY,S820098704,C,O,909903,820001,20181029,20181114,20181211,"FOB CNSHA AUSYD        ",,N,,,0040,JBJ7513,33,,,,20181114,20181211,5.38,AUD,A9430524,EACH,1
REPPTY,S820098742,C,O,909613,820001,20181029,20181114,20181211,"FOB CNTAO AUSYD        ",,N,,,0030,DF7475S,70,,,,20181114,20181211,23.52,AUD,A9485074,EACH,1
REPPTY,S820098875,C,O,909520,820001,20181101,20181120,20181217,"FOB CNSHA AUSYD        ",,N,,,0052,RST158,72,,,,20181120,20181217,1.69,AUD,A9417626,EACH,36
REPPTY,S820098875,C,O,909520,820001,20181101,20181120,20181217,"FOB CNSHA AUSYD        ",,N,,,0055,RST176,36,,,,20181120,20181217,3.63,AUD,A9445084,EACH,36
REPPTY,S820099023,C,O,909352,820001,20181102,20181120,20181217,"FOB CNTAO AUSYD        ",,N,,,0072,DB1940TS,15,,,,20181120,20181217,11.77,AUD,A9447563,SET,5

If the list is ordered, this is a very simple example of finite state machine: each H redefines the head, each L is a new output line.如果列表是有序的,这是一个非常简单的有限 state 机器示例:每个H重新定义头部,每个L是一个新的 output 行。 You shoud the csv module to parse the data:您应该使用csv模块来解析数据:

import io
import csv

DATA = """H,REPPTY,S820098509,C,S,909688,820001,20181023,20181108,20181205,"FOB CNNGB AUSYD        ",PLANOGRAM PO,N,,,
L,REPPTY,S820098509,0007,RCM4PCDUOTBLK,347,,,,20181108,20181205,7.8,AUD,A5381060,SET,1
L,REPPTY,S820098509,0018,RCMRBRRNRGRY,246,,,,20181108,20181205,5.1,AUD,A5381079,EACH,1
L,REPPTY,S820098509,0020,RCM2PCRAWGRY,246,,,,20181108,20181205,2.8,AUD,A5381083,SET,1
H,REPPTY,S820098691,C,O,909357,820001,20181029,20181114,20181211,"FOB CNNGB AUSYD        ",,N,,,
L,REPPTY,S820098691,0062,6PK1300RB,24,,,,20181114,20181211,2.32,AUD,A9437132,EACH,1
H,REPPTY,S820098695,C,O,909513,820001,20181029,20181114,20181211,"FOB CNSHA AUSYD        ",,N,,,
L,REPPTY,S820098695,0004,MTAP50EL5,226,,,,20181114,20181211,21.4,AUD,A5349617,EACH,1
L,REPPTY,S820098695,0005,MTAP50AL1,344,,,,20181114,20181211,3.3,AUD,A5349618,EACH,1
H,REPPTY,S820098704,C,O,909903,820001,20181029,20181114,20181211,"FOB CNSHA AUSYD        ",,N,,,
L,REPPTY,S820098704,0004,JTE229,32,,,,20181114,20181211,4.07,AUD,A9404146,EACH,1
L,REPPTY,S820098704,0040,JBJ7513,33,,,,20181114,20181211,5.38,AUD,A9430524,EACH,1
H,REPPTY,S820098742,C,O,909613,820001,20181029,20181114,20181211,"FOB CNTAO AUSYD        ",,N,,,
L,REPPTY,S820098742,0030,DF7475S,70,,,,20181114,20181211,23.52,AUD,A9485074,EACH,1
H,REPPTY,S820098875,C,O,909520,820001,20181101,20181120,20181217,"FOB CNSHA AUSYD        ",,N,,,
L,REPPTY,S820098875,0052,RST158,72,,,,20181120,20181217,1.69,AUD,A9417626,EACH,36
L,REPPTY,S820098875,0055,RST176,36,,,,20181120,20181217,3.63,AUD,A9445084,EACH,36
H,REPPTY,S820099023,C,O,909352,820001,20181102,20181120,20181217,"FOB CNTAO AUSYD        ",,N,,,
L,REPPTY,S820099023,0072,DB1940TS,15,,,,20181120,20181217,11.77,AUD,A9447563,SET,5"""

# two pseudo-files, source and destination
s = io.StringIO(DATA) # use `with open(..., 'r') as s:` if you have a file
d = io.StringIO() # use with open(..., 'w') as 

reader = csv.reader(s)
writer = csv.writer(d)

header = []
for row in reader:
    if row[0] == "H": # a header
        header = row[1:] # store it
    else: # a line
        assert header[:2] == row[1:3] # check the identifier
        writer.writerow(head + row[3:]) # merge rows

print(d.getvalue()) # content of the pseudo-file

Note: you have a comma more, between header and lines, because we merge the both lists.注意:您在 header 和行之间多了一个逗号,因为我们合并了两个列表。

If the lines do not follow the headers, you'll have to store the lines and the headers in some dictionary.如果这些行不跟随标题,您必须将这些行和标题存储在某个字典中。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM