首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在保存到文本文件时防止拆分行

在保存到文本文件时防止拆分行
EN

Stack Overflow用户
提问于 2021-09-09 05:39:07
回答 1查看 77关注 0票数 0

我有一个具有大约300行结构的json文件,如下所示:

代码语言:javascript
运行
复制
[
    {
        "OCR":"ANNA żółty LEWANDOWSKA\nHEALTHY SWEETS by Am 31\n",
        "Correct_title":...,
        "Correct_author":...,
        "Correct_ID":...
    },
    {
        "OCR":"some other\nstuff that should\nstay in same line",
        "Correct_title":...,
        "Correct_author":...,
        "Correct_ID":...
    }
]

这是OCR的结果。每条记录代表一本书,我只需要保存'OCR‘字段,但是将新行字符嵌入到一个字符串中。

然后对每个记录进行md5sum计数,然后根据编码名称的最后一个字符,将每个记录保存在3个文件中的一个中,即: 0-4 ->列车,5-7 -> dev-0,rest -> test-A。

注意:

  • I字符串中有非ASCII字符,所有换行符都应保存在“as- is”格式中。
  • 输出文件没有扩展名--这是强制约定,对此没有影响。

以下是我迄今尝试过的:

代码语言:javascript
运行
复制
import hashlib
file = "data/books_OCR.json"
df_ocr = pd.read_json(file, encoding='utf-8')

for item in df_ocr['OCR']:
    line = hashlib.md5(item.encode('utf-8')).hexdigest()
    p_train = re.compile(r'[0-4]$')
    p_dev = re.compile(r'[5-7]$')

    # Distribute files
    if re.match(p_train, line[-1]):
        with open('gonito/train', 'a', encoding="utf-8", newline='') as f:
            f.write(item)
    elif re.match(p_dev, line[-1]):
        with open('gonito/dev-0', 'a', encoding="utf-8", newline='') as f:
            f.write(item)
    else:
        with open('gonito/test-A', 'a', encoding="utf-8", newline='') as f:
            f.write(item)

例如,文件测试的预期输出-A是:

代码语言:javascript
运行
复制
ANNA żółty LEWANDOWSKA\nHEALTHY SWEETS by Am 31\n
some other\nstuff that should\nstay in same line

但我得到的是:

代码语言:javascript
运行
复制
ANNA LEWANDOWSKA
HEALTHY SWEETS by Am 31
some other
stuff that should
stay in same line

当我试图将记录写到*.csv或*.tsv (用‘\t’分隔)文件时,也会发生同样的事情--我得到了几行文本(记录),而不是只有1行纯文本。

是否有合理的解决办法?

EN

回答 1

Stack Overflow用户

发布于 2021-09-09 15:12:52

如注释中所述,如果您想要的话,可以轻松地用\n替换换行符。

这样做的一个问题是,包含文字反斜杠的序列将是不明确的。c:\new\tmp是否包含换行符(和选项卡)或文字反斜杠(后面是文字n )?消除歧义的正确方法是反斜杠--也可以逃避所有其他反斜杠。

代码语言:javascript
运行
复制
for item in df_ocr['OCR']:
    item = item.replace('\\', '\\\\').replace('\n', '\\n')
    ...

这里反斜杠的数量略显惊人,因为您也必须避免使用Python。

从长远来看,设计您自己的迷你格式会令人沮丧;一个更可持续的解决方案是使用已经定义的格式,如CSV (或YAML、XML或.JSON!)因此,您不必自行开发和测试任何字符级的故障,由此产生的文件将与许多标准工具进行互操作。但当然,有时候你就是别无选择。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69112784

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档