【问题标题】:How to parse a file in python given the specific structure of the file?给定文件的特定结构,如何在 python 中解析文件?
【发布时间】:2020-04-18 16:11:40
【问题描述】:

我在尝试解析文件时遇到问题,在该文件中,对于每一行,我都有如下结构,所有字符串都用引号引起来:

"is_post" "author_name" "timestamp" "tags" "text"

文件中的所有数据也都被引用了;这意味着我可能有一些东西:

"True", "auth1", "1970:01:01T23:59:59", "soccer football match", "Just a great match!"

"text" 字段内部有\n 时,就会出现问题,例如:

"True", "auth1", "1970:01:01T23:59:59", "soccer football match", "Just a great match!
Barcelona 2
Real Madrid 3

Real Madrid wins the match!"

在这种情况下,我可以通过哪种方式继续阅读下一行中的文件,直到到达下一个报价?

到目前为止我尝试过的如下:

import shlex
from typing import NamedTuple, List

class Comment(NamedTuple):
    is_post: str
    author: str
    timestamp: str
    tags: str
    text: str

comments: List[Comment]


def open_comment_file(self):
    with open(self.operations + "comments.csv", "r") as f:
        for line in f:        
            arr = shlex.split(line)
            comments.append(Comment(arr[0], arr[1], arr[2], arr[3], arr[4]))

但显然,我没有考虑line 不以引号结尾的情况,因为我正在逐行读取文件。

我该如何处理这种情况?

编辑:对于上面的例子,我想要得到的结果是一行,如下:

"True", "auth1", "1970:01:01T23:59:59", "soccer football match", "Just a great match! Barcelona 2 Real Madrid 3 Real Madrid wins the match!"

【问题讨论】:

标签: python csv


【解决方案1】:

这是一个有效的 csv 文件,包含多行字段(," 之间的空格除外)。

所以你真的应该使用csv parser 而不是使用split() 并尝试自己解析文件(这也将处理引号等)。

【讨论】:

  • 好的,但是 csv 阅读器在换行符中转义了反斜杠,所以,我将尝试使用@fralau 在评论中向我展示的问题的答案。
  • @Carmine 好的,但不确定“在换行符中转义反斜杠”是什么意思?
  • 我是说我不知道​​如何处理传递给csv阅读器的文本中的\n
  • @Carmine 如果您的意思是要保持行分开,我建议您将其作为单个字段阅读,然后在需要时拆分该字段(但这可能就是您提到的答案) .
  • @Carmine 模块 csv 应该正确解析 \n 如果文件中有真正的 \n 而不是 \\n。如果您使用字符串打印列表,您还可以看到\n - 即。 data = ["Hello \n World"]print(data) - 但是如果您手动打印每个元素,那么您会看到普通字符串 - print(data[0])。这不是数据的问题,而是您可以用来显示它的方法。
猜你喜欢
  • 1970-01-01
  • 2016-03-11
  • 1970-01-01
  • 2012-07-28
  • 2021-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-05
相关资源
最近更新 更多