使用 python 3.12 编写编码 cp1252 的 csv

问题描述 投票:0回答:1

尽管堆栈溢出的其他问题中有很多信息,但我还没有找到解决方案。 我从以 utf-8 编码的 txt 文件和 xml 文件导入数据。来自两种甲酸盐的数据被转换并分别放入 pandas 数据帧中(一个用于导入的 txt 文件,一个用于导入的 xml 文件)。每个数据帧都导出为 txt 文件。问题是这些 txt 文件必须编码为 cp1252。但它们是用 utf-8 编码的。

读取 xml 文件是通过

完成的
    import xml.etree.ElementTree as ET

    xml_file_path = path_files + xml_filename

    tree = ET.parse(xml_file_path)
    root = tree.getroot()

txt 文件的读取是通过

完成的
import csv
            
with open(txt_filename, 'r', encoding=('cp1252')) as f:
    reader = csv.reader(f, delimiter='\t')       
    list_results = list(tuple(line) for line in reader)

非 cp1252 可编码数据被替换为“?”使用此代码。

            def filter_cp1252(text):
                try:

                    encoded_text = text.encode('cp1252')
                    return text
                except UnicodeEncodeError:

                  
                    text2= ''
                    for nl, letter in enumerate(text):

                        try:
                            encoded_letter = letter.encode('cp1252')
                            text2 = text2 + letter

                        except:
                            text2 = text2 + '?'

                    return text2

非 cp 1252 的符号已成功替换为“?”。我只能在将文件导入为 utf-8 时进行测试,但为了安全起见,我将其放入代码中。

数据收集在一个列表中,并转换为 pandas 数据框。导出到 txt 完成后


df_import2.to_csv(output, header=None, index=None, sep='\t', mode ='w', encoding = 'cp1252')

尽管如此,输出是 utf-8(这让我发疯)。
有什么建议吗?我该如何解决我的问题?

我还首先将数据框导出到 Excel 并使用 pandas 重新导入,希望这可以解决问题。但 python 显然尽可能“更喜欢”utf-8。

python encoding export-to-csv cp1252
1个回答
0
投票

问题不清楚,很多代码没有用。如果文本位于错误的代码页中,

open(...,encoding='cp1252')
会抛出错误。要加载无法映射的字符,您必须在 open 中使用 errors 参数。如果您使用
errors='replace'
,字符将被
?
替换。

这意味着非拉丁文本来自 XML。您可以使用 to_csv 中的

errors argument
来将非拉丁字符替换为
?
,而不是尝试转换代码中的文本。

最后,您可以使用

read_csv
encoding='cp1252' encoding_errors='replace'
将文本数据直接读取到数据框中。

var txt_frames=pd.read_csv(txt_filename,encoding='cp1252', encoding_errors='replace',sep='\t')

合并所有帧后,您可以使用

encoding_errors='replace'
将它们另存为 CP1252:

df_import2=pd.concat(all_frames)
df_import2.to_csv(output, encoding = 'cp1252', encoding_errors='replace', header=None, index=None, sep='\t')
© www.soinside.com 2019 - 2024. All rights reserved.