使用 Python 中的 readlines() 函数检查即将到来的行的条件
Check condition on upcoming line using readlines() function in Python
我有 input.txt
文件和 output.txt
文件,它们在 Python 脚本的参数中传递。我正在使用 readline()
函数读取输入文件内容。在我更新到当前行并将其写入输出文件之前,我想检查即将到来的行的一些条件,如下所述。你能给我一些指导吗?谢谢。
如果行以 01065008
开头并满足以下条件,我想从第 11 个位置用 internal_account
值(16 位随机数)更新当前行。
- 第 5 行以
06
和 开头
- 以
06
开头的行从第 6 个字符开始的值为 USD
input.txt
01065008200520P629658405456454
02BRYAN ANGUS 56425555643
0300000000000000000HUTS7858863
04PROSPECTUS ENCLOSYUSS574U623
05AS OF 05/13/20 45452366753
06Q47USDTFT 87845566765
input.txt
文件有模式:
1st line will start with 010065008
2nd line will start with 02
...
6th line will start with 06
1st line will start with 010065008
...
我试过什么?
import random
import sys
infile=open(sys.argv[1], 'r')
lines=infile.readlines()
outfile=open(sys.argv[2], 'w')
internal_account = random.randint(1000000000000000,9999999999999999)
formattedStr = ''
for line in lines:
if line[0:8] == '01065008':
formattedStr='%s%s%s'%(line[0:10],internal_account,line[26:])
outfile.write(formattedStr)
else:
outfile.write(line)
outfile.close()
要在文本文件中向前检查,将所有行读入列表,然后使用行索引向前检查行。使用enumerate
函数来跟踪行索引。
ss = '''
01065008200520P629658405456454
02BRYAN ANGUS 56425555643
0300000000000000000HUTS7858863
04PROSPECTUS ENCLOSYUSS574U623
05AS OF 05/13/20 45452366753
06Q47USDTFT 87845566765
'''.strip()
with open ('input.txt','w') as f: f.write(ss) # write data file
###############################3
import random
import sys
infile=open('input.txt') #open(sys.argv[1], 'r')
lines=infile.readlines()
outfile=open('output.txt','w') #open(sys.argv[2], 'w')
internal_account = random.randint(1000000000000000,9999999999999999)
print('internal_account', internal_account, end='\n\n')
formattedStr = ''
for i,line in enumerate(lines):
line
if line[0:8] == '01065008' and i < len(lines)-5 and lines[i+5].startswith('06') and lines[i+5][5:8] == 'USD':
formattedStr='%s%s%s'%(line[0:10],internal_account,line[26:])
outfile.write(formattedStr)
print(formattedStr.strip())
else:
outfile.write(line)
print(line.strip())
outfile.close()
输出
internal_account 2371299802657810
010650082023712998026578106454
02BRYAN ANGUS 56425555643
0300000000000000000HUTS7858863
04PROSPECTUS ENCLOSYUSS574U623
05AS OF 05/13/20 45452366753
06Q47USDTFT 87845566765
您离找到好的解决方案不远了。使用 enumerate on input lines let use use the index to check future lines so you can verify if all your conditions are fulfilled. You need to catch IndexError 以便在剩余行数不足时不会引发异常。
我对您的代码进行的其他小修改:
- 使用 with 语句处理文件打开以避免必须自己关闭文件。
- 尽可能使用 startswith 以使代码更清晰。
- 尽可能使用科学计数法使代码更清晰。
import random
import sys
input_file, output_file = sys.argv[0:2]
internal_account = random.randint(1e15, 9999999999999999)
with open(input_file, "r") as stream:
input_lines = stream.readlines()
with open(output_file, "w") as stream:
for index, line in enumerate(input_lines):
try:
update_account = (
line.startswith("01065008")
and input_lines[index + 5].startswith("06")
and input_lines[index + 5][5:8] == "USD"
)
except IndexError:
update_account = False
if update_account:
line = line[0:10] + str(internal_account) + line[26:]
stream.write(line)
我有 input.txt
文件和 output.txt
文件,它们在 Python 脚本的参数中传递。我正在使用 readline()
函数读取输入文件内容。在我更新到当前行并将其写入输出文件之前,我想检查即将到来的行的一些条件,如下所述。你能给我一些指导吗?谢谢。
如果行以 01065008
开头并满足以下条件,我想从第 11 个位置用 internal_account
值(16 位随机数)更新当前行。
- 第 5 行以
06
和 开头
- 以
06
开头的行从第 6 个字符开始的值为USD
input.txt
01065008200520P629658405456454
02BRYAN ANGUS 56425555643
0300000000000000000HUTS7858863
04PROSPECTUS ENCLOSYUSS574U623
05AS OF 05/13/20 45452366753
06Q47USDTFT 87845566765
input.txt
文件有模式:
1st line will start with 010065008
2nd line will start with 02
...
6th line will start with 06
1st line will start with 010065008
...
我试过什么?
import random
import sys
infile=open(sys.argv[1], 'r')
lines=infile.readlines()
outfile=open(sys.argv[2], 'w')
internal_account = random.randint(1000000000000000,9999999999999999)
formattedStr = ''
for line in lines:
if line[0:8] == '01065008':
formattedStr='%s%s%s'%(line[0:10],internal_account,line[26:])
outfile.write(formattedStr)
else:
outfile.write(line)
outfile.close()
要在文本文件中向前检查,将所有行读入列表,然后使用行索引向前检查行。使用enumerate
函数来跟踪行索引。
ss = '''
01065008200520P629658405456454
02BRYAN ANGUS 56425555643
0300000000000000000HUTS7858863
04PROSPECTUS ENCLOSYUSS574U623
05AS OF 05/13/20 45452366753
06Q47USDTFT 87845566765
'''.strip()
with open ('input.txt','w') as f: f.write(ss) # write data file
###############################3
import random
import sys
infile=open('input.txt') #open(sys.argv[1], 'r')
lines=infile.readlines()
outfile=open('output.txt','w') #open(sys.argv[2], 'w')
internal_account = random.randint(1000000000000000,9999999999999999)
print('internal_account', internal_account, end='\n\n')
formattedStr = ''
for i,line in enumerate(lines):
line
if line[0:8] == '01065008' and i < len(lines)-5 and lines[i+5].startswith('06') and lines[i+5][5:8] == 'USD':
formattedStr='%s%s%s'%(line[0:10],internal_account,line[26:])
outfile.write(formattedStr)
print(formattedStr.strip())
else:
outfile.write(line)
print(line.strip())
outfile.close()
输出
internal_account 2371299802657810
010650082023712998026578106454
02BRYAN ANGUS 56425555643
0300000000000000000HUTS7858863
04PROSPECTUS ENCLOSYUSS574U623
05AS OF 05/13/20 45452366753
06Q47USDTFT 87845566765
您离找到好的解决方案不远了。使用 enumerate on input lines let use use the index to check future lines so you can verify if all your conditions are fulfilled. You need to catch IndexError 以便在剩余行数不足时不会引发异常。
我对您的代码进行的其他小修改:
- 使用 with 语句处理文件打开以避免必须自己关闭文件。
- 尽可能使用 startswith 以使代码更清晰。
- 尽可能使用科学计数法使代码更清晰。
import random
import sys
input_file, output_file = sys.argv[0:2]
internal_account = random.randint(1e15, 9999999999999999)
with open(input_file, "r") as stream:
input_lines = stream.readlines()
with open(output_file, "w") as stream:
for index, line in enumerate(input_lines):
try:
update_account = (
line.startswith("01065008")
and input_lines[index + 5].startswith("06")
and input_lines[index + 5][5:8] == "USD"
)
except IndexError:
update_account = False
if update_account:
line = line[0:10] + str(internal_account) + line[26:]
stream.write(line)