我有一个以制表符分隔格式“test.exp”从程序中导出的数据:
"HEADER" "ID" "Part Reference" "Value" "Part_Description"
"PARTOCC:17306" "17306" "M1" "48SL-5S-50-C-LF" "Series 48SL–5 WEDGE–LOK, 2-56UNC-2B, 5.00", chem film, lock washer and flat"
"PARTOCC:17310" "17310" "M2" "48SL-5S-50-C-LF" "Series 48SL–5 WEDGE–LOK, 2-56UNC-2B, 5.00", chem film, lock washer and flat"
"PARTOCC:65494" "65494" "J4E" "311P822-MC-095-BS-D" "GSFC CPCI J3 RA MALE 95 Position 0.123" tails"
字符串
注意,在这个程序的输出格式中没有选项,我们有很多这样的文件要摄取到零件数据库中。注意,5.00”嵌入在制表符分隔的文件中。
把这个文件放在一个框架中,然后把它写回来:
import pandas as pd
exp_fn = r"test.exp"
exp_df = pd.read_csv(exp_fn, sep='\t', dtype=str, encoding='mbcs')
exp_df.to_csv(r"check.exp", sep='\t')
型
对于这个测试用例,我们希望check.exp文件与test.exp文件匹配。使用IDE,您可以检查“读取后的框架”,看看5.00”发生了什么。
我一直无法找到正确的语法,无论是读还是写,都不会损坏嵌入的引号。
简而言之,我把这个发到了一个领域:
"Series 48SL–5 WEDGE–LOK, 2-56UNC-2B, 5.00", chem film, lock washer and flat"
型
但我回来了:"Series 48SL–5 WEDGE–LOK, 2-56UNC-2B, 5.00, chem film, lock washer and flat"""
我希望使输出匹配的输入制表符分隔的文件,输入和输出格式相同。
3条答案
按热度按时间3duebb1j1#
如果您需要该示例行最终看起来像这样:
字符串
1.字段总是有一个开始和结束(* 封闭 *)双引号
1.字段不包含选项卡作为值(需要用引号括起来)
1.字段不包含任何换行符作为值(也需要用引号括起来)
你可以尝试在解析过程中忽略引号,然后用一些简单的字符串切片手动删除封闭的引号。
最简单的方法看起来像:
型
我在问题中的多行样本上运行了它,我得到:
型
你的要求,然后写出来的解析和固定的结果,因为你得到他们没有意义给我。如果你只是需要解析和摄取,停在那里。为什么要尝试写一个错误编码的TSV文件?也许写最终正确的编码,以帮助未来的程序员/操作?
更新:input == output
考虑你的注解和测试输入与输出;下面的代码试图解释解析错误TSV的责任。用于解析的代码化值将再次用于尝试和重新创建错误编码。我相信这个程序应该证明解码和编码的代码化思想是正确的,并且如果输出等于输入,那么数据在其间没有改变:
我这样运行:
型
我什么也得不到,这意味着输出等于输入。
更新:使用Andrej方法的往返
lg40wkob2#
查看您的文件,如果没有一些预处理,将很难解析。您可以使用
re
模块并手动添加转义字符,例如:字符串
打印:
型
dluptydi3#
这两种方法都让我陷入了困境。我遇到的问题是,使用df.to_csv()或df.read_csv()的库在有效的制表符分隔值文件中改变了嵌入的双引号。为了解决这个问题,我尝试了Zach和Andrej的方法。
为了写出嵌套框并避免使用lib代码,比如df.to_csv(),它改变了编写嵌入式双引号的方式,这基本上是不好的。迭代嵌套框行值,展平列表,遍历列表并构建一个带有“\t”分隔符的字符串,写入文件,例如。
字符串
感谢您发送编修。