打开文件并匹配Engr Label

时间:2012-11-14 00:19:50

标签: python

1.从构建位置获取buildid,这是“\”之后的最后一个单词,在这种情况下是“A1234ABCDE120083.1”

2.获取buildid后,打开一个文件,然后尝试匹配“Engr Label:Data_CRM_PL_177999”行以获取标签名称“Data_CRM_PL_177999”

3.最终输出应为“Data_CRM_PL_177999”

由于某种原因,我收到以下语法错误..

 import re

 Buildlocation= '\\umor\locations455\INT\A1234ABCDE120083.1'

 Labelgetbuildlabel(Buildlocation)

def getbuildlabel(BuildLocation):
buildid=BuildLocation.split('\')[-1]
Notes=os.path.join(BuildLocation,Buildid + '_notes.txt')
if os.path.exists(Notes):
    try:
        open(Notes)
    except IOError as er:
        pass
    else:
        for i in Notes.splitlines:
        if i.find(Engr Label)
            label=i.split(:)[-1]

print label//output should be Data_CRM_PL_177999

输出应为: -

Line looks like below in the file
Engr Label: Data_CRM_PL_177999

语法错误

 buildid=BuildLocation.split('\')[-1]
                                   ^
 SyntaxError: EOL while scanning string literal

2 个答案:

答案 0 :(得分:1)

反斜杠正在逃避'字符(请参阅escape codes documentation

请尝试使用此行:

 buildid=BuildLocation.split('\\')[-1]    

现在你有一个反斜杠转义反斜杠,所以你的字符串是一个字面反斜杠。你可以做的另一件事是告诉Python这个字符串没有任何转义码,前缀为r,如下所示:

 buildid=BuildLocation.split(r'\')[-1]   

你也有很多其他问题。

Python中的注释字符为#,而不是//

我认为您还会将文件名与文件对象混淆。

Notes是您尝试打开的文件的名称。然后,当您调用open(Notes)时,您将获得一个可以从中读取数据的文件对象。

所以你应该替换:

open(Notes)

f = open(Notes)

然后替换:

for i in Notes.splitlines:

for line in f:

当您对文件对象进行for循环时,Python会自动为您提供一行。

现在你可以检查每一行:

if line.find("Engr Label") != -1:
  label = line.split(':')[-1]

答案 1 :(得分:1)

在第

buildid=BuildLocation.split('\')[-1]

反斜杠实际上是通过以下引号转义的 所以,Python认为这实际上是你的字符串:

'[-1])

相反,您应该执行以下操作:

buildid=BuildLocation.split('\\')[-1]

Python会将你的字符串解释为

\\

有趣的是,StackOverflow的语法高亮显示提示了这个问题。如果您查看代码,它会在第一个斜杠之后将所有内容视为字符串的一部分,一直到代码示例的结尾。

您的代码中还有其他一些问题,所以我尝试为您清理一下。 (但是,我没有该文件的副本,所以显然,我无法对此进行测试)

import re
import os.path

build_location= r'\\umor\locations455\INT\A1234ABCDE120083.1'


label = get_build_label(build_location)

# Python prefers function and variable names to be all lowercase with
# underscore separating words.
def get_build_label(build_location):
    build_id = build_location.split('\\')[-1]
    notes_path = os.path.join(build_location, build_id + '_notes.txt')
    # notes_path is the filename (a string)
    try:
        with open(notes_path) as notes:
            # The 'with' keyword will automatically open and close
            # the file for you
            for line in notes:
                if line.find('Engr Label'):
                    label = line.split(':')[-1]
                    return label
    except IOError:
        # No need to do 'os.path.exists' since notes_path doesn't
        # exist, then the IOError exception will be raised.
        pass
print label