【问题标题】:Read verbatim string from file从文件中读取逐字字符串
【发布时间】:2014-02-12 23:47:21
【问题描述】:

我需要读取存储在文件中的字符串逐字。我试过在单引号和双引号之间写字符串,但这似乎不起作用。

这是MWE 我的意思:

with open('file.dat', mode="r") as f:
    for line in f:
        reader = line.split()
        # Read string.
        liter = str(reader[1])

print liter

file.dat 文件由单行组成,如下所示:

ID  " Literal\t : "

其中第一列包含帮助我识别行的 ID,第二列应包含作为单个元素的字符串。

这个字符串看起来并不总是完全相同。例如,它可以在开头没有字符(即:"Literal\t : ")有空格而不是\t 字符(即" Literal : ")在开头或结尾没有空格(即:"Literal\t :")等。 .

我所追求的结果与我简单地得到的结果相同(在上面的例子中):

liter = ' Literal\t : '

我该怎么做?

【问题讨论】:

  • 更大的数据样本会有所帮助。 line.split(None, 1)ast.literal_eval(liter[1]),但通常最好避免使用 literal_eval,除非您对内容拥有独占控制权。
  • 如果您是编写 .dat 文件的人,为什么不使用不同的列分隔符,例如“|”?
  • 您的意思是让字符串中的\t 成为制表符,还是保留两个字符,一个反斜杠和一个t?目前还不清楚您要做什么以及“逐字”是什么意思。
  • @Blckknght 查看更新的答案。我追求的结果与我所做的完全相同 liter = ' Literal\t : '

标签: python string file-io


【解决方案1】:

好吧,如果保证您的数据总是一模一样,您可以使用正则表达式:

import re

data = '''
ID  " Literal\t : "
'''

for line in data.split('\n'):
    if line:
        liter = re.search(r'"(.*)"', line).groups()[0]
        print(liter)
        print(repr(liter))

结果:

 Literal     : 
' Literal\t : '

【讨论】:

  • 请查看更新后的问题@senshin,“如果保证您的数据始终看起来完全一样”是什么意思?
  • @Gabriel 我的意思是,如果你的数据的每一行都包含一个 ID,它不包含双引号,然后是你的文字字符串,它被双引号包围,而不是后面其他任何东西,那么这将起作用。
【解决方案2】:

使用csv 模块读取您的文件怎么样?它支持您想要的任何分隔符,并且可以支持多种引用包含分隔符的文本的方式。看起来您需要一个空格分隔符和包含空格的字符串的引号(这是默认的引号样式):

with open('file.dat', newlines="") as f: # if you're using Python 2, open in binary mode
    reader = csv.reader(f, delimiter=" ")
    for line in reader:
        print(line) # for the example data, line[1] will be " Literal\\t : "

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-12
    • 1970-01-01
    • 2010-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多