You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Julia writedlm遇字符串含引号时添加多余引号问题求助

关于Julia writedlm导出含引号行时添加多余引号的问题

问题描述

将文件按换行分割为字符串列表,修改部分行后用writedlm写回时,发现包含引号的行被自动添加了外层引号,内部引号也被转义成双引号。示例代码、原文件及输出文件如下:

示例代码

file = "og_file.F"
new_file = "new_file.F"
f = read(file, String)
meta = split(f, "\n")
writedlm(new_file, meta)

原文件内容

#include "DARWIN_OPTIONS.h"

CBOP
C !ROUTINE: DARWIN_PLANKTON
C !INTERFACE: ==========================================================
      SUBROUTINE DARWIN_PLANKTON(
     I     Ptr,
     U     gTr,
     O     chlout, diags,
     I     PAR, photoTempFunc, hetTempFunc, grazTempFunc, reminTempFunc,
     I     mortTempFunc, mort2TempFunc, uptakeTempFunc,
#ifdef DARWIN_DEBUG
     I     iG, jG, k, dT,
#endif
     I     myTime,myIter,myThid)

C !DESCRIPTION:

C !USES: ===============================================================
      IMPLICIT NONE
#ifdef ALLOW_RADTRANS
#include "RADTRANS_SIZE.h"
#endif
#include "DARWIN_SIZE.h"
#include "DARWIN_INDICES.h"
#include "DARWIN_DIAGS.h"
#include "DARWIN_RADTRANS.h"
#include "DARWIN_PARAMS.h"
#include "DARWIN_TRAITS.h"

输出文件内容

"#include ""DARWIN_OPTIONS.h"""

CBOP
C !ROUTINE: DARWIN_PLANKTON
C !INTERFACE: ==========================================================
      SUBROUTINE DARWIN_PLANKTON(
     I     Ptr,
     U     gTr,
     O     chlout, diags,
     I     PAR, photoTempFunc, hetTempFunc, grazTempFunc, reminTempFunc,
     I     mortTempFunc, mort2TempFunc, uptakeTempFunc,
#ifdef DARWIN_DEBUG
     I     iG, jG, k, dT,
#endif
     I     myTime,myIter,myThid)

C !DESCRIPTION:

C !USES: ===============================================================
      IMPLICIT NONE
#ifdef ALLOW_RADTRANS
"#include ""RADTRANS_SIZE.h"""
#endif
"#include ""DARWIN_SIZE.h"""
"#include ""DARWIN_INDICES.h"""
"#include ""DARWIN_DIAGS.h"""
"#include ""DARWIN_RADTRANS.h"""
"#include ""DARWIN_PARAMS.h"""
"#include ""DARWIN_TRAITS.h"""

问题原因

这不是writedlm的bug,而是它的预期设计行为。writedlm的定位是处理表格/分隔符分隔的数据,默认会对包含特殊字符(如引号、分隔符)的字符串添加外层引号包裹,并将内部引号转义为双引号,以此避免数据解析时出现歧义。而你的场景是单纯的文本文件读写,并不需要表格格式的转义逻辑。

解决办法

针对纯文本读写场景,有两种更合适的处理方式:

方法1:直接使用文本写入函数

跳过writedlm,用write或open+println直接写入文本,完全保留原格式:

file = "og_file.F"
new_file = "new_file.F"
f = read(file, String)
meta = split(f, "\n")

# 方式A:拼接字符串后写入
write(new_file, join(meta, "\n"))

# 方式B:逐行写入(更适合处理大文件)
open(new_file, "w") do io
    for line in meta
        println(io, line)
    end
end

方法2:修改writedlm参数

如果一定要使用writedlm,可以通过quotemark=nothing参数禁用引号包裹逻辑:

writedlm(new_file, meta, quotemark=nothing)

反馈说明

由于这是writedlm的预期行为,不属于bug。如果后续遇到不符合官方文档描述的异常问题,可前往Julia官方GitHub仓库的Issue板块提交反馈。

内容的提问来源于stack exchange,提问作者bbbddd

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 14:02:44