从Python中的一行文本拆分或剥离可变数量的字符?

时间:2013-08-22 18:21:47

标签: python string

我有大量此类数据:

  array(14) {
    ["ap_id"]=>
    string(5) "22755"
    ["user_id"]=>
    string(4) "8872"
    ["exam_type"]=>
    string(32) "PV Technical Sales Certification"
    ["cert_no"]=>
    string(12) "PVTS081112-2"
    ["explevel"]=>
    string(1) "0"
    ["public_state"]=>
    string(2) "NY"
    ["public_zip"]=>
    string(5) "11790"
    ["email"]=>
    string(19) "ivorabey@zeroeh.com"
    ["full_name"]=>
    string(15) "Ivor Abeysekera"
    ["org_name"]=>
    string(21) "Zero Energy Homes LLC"
    ["org_website"]=>
    string(14) "www.zeroeh.com"
    ["city"]=>
    string(11) "Stony Brook"
    ["state"]=>
    string(2) "NY"
    ["zip"]=>
    string(5) "11790"
  }

我在python中编写了一个for循环,它读取文件,为每个数组创建一个字典并存储如下的元素:

a = 0
data = [{}]

with open( "mess.txt" ) as messy:
        lines = messy.readlines()
        for i in range( 1, len(lines) ):
            line = lines[i]
            if "public_state" in line:
                data[a]['state'] = lines[i + 1]
            elif "public_zip" in line:
                data[a]['zip'] = lines[i + 1]
            elif "email" in line:
                data[a]['email'] = lines[i + 1]
            elif "full_name" in line:
                data[a]['contact'] = lines[i + 1]
            elif "org_name" in line:
                data[a]['name'] = lines[i + 1]
            elif "org_website" in line:
                data[a]['website'] = lines[i + 1]
            elif "city" in line:
                data[a]['city'] = lines[i + 1]
            elif "}" in line:
                a += 1
                data.append({})

我知道我的代码很糟糕,但我对Python很新。如您所见,我的大部分项目已经完成。剩下的就是从实际数据中删除代码标签。例如,我需要string(15) "Ivor Abeysekera"成为Ivor Abeysekera"

经过一些研究,我考虑过.lstrip(),但由于前面的文字总是不同的......我被卡住了。

有没有人有一个聪明的方法来解决这个问题?干杯!

编辑:我在Windows 7上使用Python 2.7。

4 个答案:

答案 0 :(得分:2)

BAD SOLUTION基于当前问题

但要回答你的问题,请使用

info_string = lines[i + 1]
value_str = info_string.split(" ",1)[-1].strip(" \"")

更好的解决方案

你是否可以访问php生成....如果你只是echo json_encode($data);而不是使用var_dump

如果你有输出json它(json输出)将看起来像

{"variable":"value","variable2","value2"}

然后你可以像

一样阅读
import json
json_str = requests.get("http://url.com/json_dump").text  # or however you get the original text
data = json.loads(json_str)
print data

答案 1 :(得分:2)

根据代码标记的格式,您可以在"上拆分行,然后选择第二个元素。

s = 'string(15) "Ivor Abeysekera"'
temp = s.split('"')[1]
# temp is 'Ivor Abeysekera'

请注意,这将消除尾随",如果您需要它,您可以随时将其重新添加。在您的示例中,这将是:

data[a]['state'] = lines[i + 1].split('"')[1]
# etc. for each call of lines[i + 1]

因为你这么称呼它(无论你使用什么答案),你应该把它变成一个函数:

def prepare_data(line_to_fix):
    return line_to_fix.split('"')[1]
# latter on...
data[a]['state'] = prepare_data(lines[i + 1])

这将为您提供更多灵活性。

答案 2 :(得分:1)

你应该使用正则表达式(正则表达式): http://docs.python.org/2/library/re.html

使用以下代码可以轻松完成您打算做的事情:

# Import the library
import re

# This is a string just to demonstrate
a = 'string(32) "PV Technical Sales Certification"'

# Create the regex
p = re.compile('[^"]+"(.*)"$')

# Find a match
m = p.match(a)

# Your result will be now in s
s = m.group(1)

希望这有帮助!

答案 3 :(得分:0)

您可以通过循环遍历所有行并跟踪您在块中的位置来有条不紊地执行此操作:

# Make field names to dict keys
fields = {
    'public_state': 'state',
    'public_zip': 'zip',
    'email': 'email',
    'full_name': 'contact',
    'org_name': 'name',
    'org_website': 'website',
    'city': 'city',
}

data = []
current = {}
key = None
with open( "mess.txt" ) as messy:
    for line in messy.split('\n'):
        line = line.lstrip()
        if line.startswith('}'):
            data.append(current)
            current = {}
        elif line.startswith('['):
            keyname = line.split('"')[1]
            key = fields.get(keyname)
        elif key is not None:
            # Get everything betweeen the first and last quotes on the line
            value = line.split('"', 1)[1].rsplit('"', 1)[0]
            current[key] = value

这样可以避免跟踪文件中的位置,这也意味着您可以处理大量数据文件(如果您在每条记录之后处理字典),而无需一次将整个内容加载到内存中。事实上,让我们将其重组为一次处理数据块的生成器,并为您提供使用的序列:

fields = {
    'public_state': 'state',
    'public_zip': 'zip',
    'email': 'email',
    'full_name': 'contact',
    'org_name': 'name',
    'org_website': 'website',
    'city': 'city',
}

def dict_maker(fileobj):
    current = {}
    key = None
    for line in fileobj:
        line = line.lstrip()
        if line.startswith('}'):
            yield current
            current = {}
        elif line.startswith('['):
            keyname = line.split('"')[1]
            key = fields.get(keyname)
        elif key is not None:
            # Get everything betweeen the first and last quotes on the line
            value = line.split('"', 1)[1].rsplit('"', 1)[0]
            current[key] = value

with open("mess.txt") as messy:
    for d in dict_maker(messy):
        print d

这使得你的主循环变得微小且易于理解:你可以一次一个地循环遍历潜在的大量词汇,并对它们做些什么。它完全将制作字典的行为与消费它们的行为区分开来。由于生成器是有状态的,并且一次只处理一行,您可以传入任何看起来像文件的内容,例如字符串列表,Web请求的输出,从另一个编程写入{{1}的输入或者其他什么。