我有一个文件,其中列出了一些Python内置类型的值:None,整数和字符串,以及正确的Python语法,包括转义。例如,文件可能如下所示:
2
"""\\nfoo
bar
""" 'foo bar'
None
然后我想将该文件读入值的数组中。对于上面的示例,数组将是:
[2, '\\nfoo\nbar\n', 'foo bar', None]
我可以通过仔细解析和/或使用split
函数来做到这一点。
有一种简单的方法吗?
答案 0 :(得分:2)
我建议您更改文件格式。那就是说,你所拥有的是可以解析的。如果您有像列表这样的多标记值,但只有None,整数和字符串,则可能会更难解析,您可以使用tokenize
对输入进行标记,并使用ast.literal_eval
之类的内容进行解析:< / p>
import tokenize
import ast
values = []
with open('input_file') as f:
for token_type, token_string, _, _, _ in tokenize.generate_tokens(f.readline):
# Ignore newlines and the file-ending dummy token.
if token_type in (tokenize.ENDMARKER, tokenize.NEWLINE, tokenize.NL):
continue
values.append(ast.literal_eval(token_string))
答案 1 :(得分:0)
您可以使用ast.literal_val
>>> import ast
>>> ast.literal_eval('2')
2
>>> type(ast.literal_eval('2')
<type 'int'>
>>> ast.literal_eval('[1,2,3]')
[1, 2, 3]
>>> type(ast.literal_eval('[1,2,3]')
<type 'list'>
>>> ast.literal_eval('"a"')
'a'
>>> type(ast.literal_eval('"a"')
<type 'str'>
答案 2 :(得分:0)
这几乎可以让你到达那里,但是由于字符串的工作方式,最终结合了两个字符串:
import ast
with open('tokens.txt') as in_file:
current_string = ''
tokens = []
for line in in_file:
current_string += line.strip()
try:
new_token = ast.literal_eval(current_string)
tokens.append(new_token)
current_string = ''
except SyntaxError:
print("Couldn't parse current line, combining with next")
tokens
Out[8]: [2, '\\nfoobarfoo bar', None]
问题在于,在Python中,如果你有两个字符串文字彼此相邻,即使你不使用+
,它们也会连接,例如:
x = 'string1' 'string2'
x
Out[10]: 'string1string2'
答案 3 :(得分:0)
我为发布我自己的问题的答案而道歉,但看起来,有效的是,我用逗号替换未加引号的空格(包括换行符),然后将[]放在整个事物并导入。