Python(3.5) - 构造保存文件的字符串 - 字符串包含转义字符

时间:2016-12-12 16:42:12

标签: python python-3.5

我使用Python(3.5)循环访问一些.msg文件,从中提取数据,其中包含一个用于下载文件的URL和一个文件应该进入的文件夹。我已成功从.msg文件中提取数据,但现在当我尝试将下载文件的绝对文件路径拼凑在一起时,格式最终变得怪异,带有反斜杠和\ t \ r \ n。

以下是代码的缩写视图:

for file in files:
    file_abs_path = script_dir + '/' + file
    print(file_abs_path)

    outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")
    msg = outlook.OpenSharedItem(file_abs_path)

    pattern = re.compile(r'(?:^|(?<=\n))[^:<\n]*[:<]\s*([^>\n]*)', flags=re.DOTALL)
    results = pattern.findall(msg.Body)

    # results[0] -> eventID
    regexID = re.compile(r'^[^\/\s]*', flags=re.DOTALL)
    filtered = regexID.findall(results[0])
    eventID = filtered[0]
    # print(eventID)

    # results[1] -> title
    title = results[1].translate(str.maketrans('','',string.punctuation)).replace(' ', '_') #results[1]
    title = unicodedata.normalize('NFKD', title).encode('ascii', 'ignore')
    title = title.decode('UTF-8')
    #results[1]
    print(title)

    # results[2] -> account
    regexAcc = re.compile(r'^[^\(\s]*', flags=re.DOTALL)
    filtered = regexAcc.findall(results[2])
    account = filtered[0]
    account = unicodedata.normalize('NFKD', account).encode('ascii', 'ignore')
    account = account.decode('UTF-8')
    # print(account)

    # results[3] -> downloadURL
    downloadURL = results[3]
    # print(downloadURL)
    rel_path = account + '/' + eventID + '_' + title + '.mp4'
    rel_path = unicodedata.normalize('NFKD', rel_path).encode('ascii', 'ignore')
    rel_path = rel_path.decode('UTF-8')
    filename_abs_path = os.path.join(script_dir, rel_path)
    # Download .mp4 from a url and save it locally under `file_name`:
    with urllib.request.urlopen(downloadURL) as response, open(filename_abs_path, 'wb') as out_file:
        shutil.copyfileobj(response, out_file)

    # print item [ID - Title] when done
    print('[Complete] ' + eventID + ' - ' + title)

    del outlook, msg

因为你可以看到我有一些正则表达式从.msg中提取4个数据。然后我必须经历每一个并做一些进一步的微调,但随后有我需要的东西:

eventID
# 123456

title 
# Name_of_item_with_underscord_no_punctuation 

account
# nameofaccount

downloadURL
# http://download.com/basicurlandfile.mp4

所以这是我得到的数据,我print()关闭它并且它没有任何奇怪的字符。但是当我尝试构造.mp4(文件名和目录)的路径时:

downloadURL = results[3]
# print(downloadURL)
rel_path = account + '/' + eventID + '_' + title + '.mp4'
rel_path = unicodedata.normalize('NFKD', rel_path).encode('ascii', 'ignore')
rel_path = rel_path.decode('UTF-8')
filename_abs_path = os.path.join(script_dir, rel_path)
# Download .mp4 from a url and save it locally under `file_name`:
with urllib.request.urlopen(downloadURL) as response, open(filename_abs_path, 'wb') as out_file:
    shutil.copyfileobj(response, out_file)

执行此操作后,运行代码得到的输出是:

Traceback (most recent call last): File "sfaScript.py", line 65, in <module> with urllib.request.urlopen(downloadURL) as response, open(filename_abs_path, 'wb') as out_file: OSError: [Errno 22] Invalid argument: 'C:/Users/Kenny/Desktop/sfa_kenny_batch_1\\accountnamehere/123456_Name_of_item_with_underscord_no_punctuation\t\r.mp4'

TL; DR - 问题

所以filename_abs_path以某种方式改变了 C:/Users/Kenny/Desktop/sfa_kenny_batch_1\\accountnamehere/123456_Name_of_item_with_underscord_no_punctuation\t\r.mp4

我需要它

C:/Users/Kenny/Desktop/sfa_kenny_batch_1/accountnamehere/123456_Name_of_item_with_underscord_no_punctuation.mp4

感谢您提供的任何帮助!

1 个答案:

答案 0 :(得分:1)

看起来您的正则表达式在\t

中捕获了制表字符{\r)和换行符字符title

对此的快速修正是:

title  = title.strip()

(在编写文件名之前)

删除所有&#34;空白&#34;字符,包括制表和回车字符。