我可以重命名此Python文件以包含文件中的字符串吗?

时间:2017-09-20 19:02:32

标签: python json amazon-web-services

可能有点令人困惑,但在这个上忍受我...

我有一个python脚本,它可以提取AWS SQS消息,对它们进行解密/解压缩,然后将它们作为JSON文件放在目录中供用户访问。用户现在正在请求更改文件的名称...现在文件名是AWS中的消息ID,他们希望它是Transaction Number,只有在解压缩并解密后才能在文件中找到。这是我现在正在运行的脚本

import argparse
import boto.sqs
import json
import os
import base64
import zlib

parser = argparse.ArgumentParser(description='Saves all messages from an AWS SQS queue into a folder.')

parser.add_argument(
     '-q', '--queue', dest='queue', type=str, required=True,
     help='The name of the AWS SQS queue to save.')

parser.add_argument(
     '-a', '--account', dest='account', type=str,
     help='The AWS account ID whose queue is being saved.')

parser.add_argument(
     '-o', '--output', dest='output', type=str, default='queue-messages',
     help='The output folder for saved messages.')

parser.add_argument(
     '-r', '--region', dest='aws_region', type=str, required=True,
     help='The AWS region where the queue is located.')

parser.add_argument(
     '-k', '--key', dest='aws_key', type=str, required=True,
     help='Your AWS account key.')

parser.add_argument(
     '-s', '--secret', dest='aws_secret', type=str, required=True,
     help='Your AWS account secret.')

parser.add_argument(
     '-d', '--delete', dest='delete', default=False, action='store_true',
     help='Whether or not to delete saved messages from the queue.')

parser.add_argument(
     '-v', '--visibility', dest='visibility', type=int, default=60,
     help='The message visibility timeout for saved messages.')

args = parser.parse_args()

print (args.aws_region)
print (args.aws_key)
print (args.aws_secret)

if not os.path.exists(args.output):
     os.makedirs(args.output)

conn = boto.sqs.connect_to_region(
     args.aws_region,
     aws_access_key_id=args.aws_key,
     aws_secret_access_key=args.aws_secret)

print('Connection: ', conn)
queue = conn.get_queue(args.queue)

count = 0

while True:
     messages = queue.get_messages(
             num_messages=10,
             message_attributes=['All'],
             visibility_timeout=args.visibility)
     if len(messages) == 0: break

     for msg in messages:
         filename = os.path.join(args.output, msg.id)

         decoded_data = base64.b64decode(msg.get_body())
         decompressed_data = zlib.decompress(decoded_data, 16+zlib.MAX_WBITS)
         obj = { 'id': msg.id,
                 'attributes': msg.message_attributes,
                 'body': decompressed_data.decode('utf-8') }
         print('decompressed_data: ', decompressed_data.decode('utf-8'))
         with open(filename, 'w') as f:
             f.write(str(decompressed_data) + '\n')
             count += 1
 ##            print 'Saved message to {}'.format(filename)
             if args.delete:
                 queue.delete_message(msg)

##print '{} messages saved'.format(count)

我认为我没有办法将此添加到此脚本中,但是还有另一种方法可以在脚本完成时命名文件“TransactionNumber”.json吗?

这是输出json的一部分我需要拉出并作为文件名...只是作为文件名的数字。

"createdAt":"2017-09-20T13:57:36.476Z","transactionNo":"10591581413677"}],"isReturnForService":0,

我正在编写一个脚本来提取这个数字

with open('*directory*','r') as f:
for line in f:
    if line.startswith('transactionNo'):
        flag=True
    if flag:
        data.append(line)
    if line.strip().endswith('}]'):
        flag=False

然后将此结果用作变量,然后使用此变量运行重命名脚本,但似乎无法使其工作。我还应该采取其他任何方向吗?

1 个答案:

答案 0 :(得分:0)

这没有意义:

if line.startswith('transactionNo'):

使用if 'transactionNo' in line:json.load()或:

xact_re = re.compile(r'"transactionNo":"(\d+)"')
for line in f:
    m = xact_re.search(line)
    if m:
        print('transactionNo is %d' % int(m.group(1)))