postgresql - 在用 pandas 导出到 csv 的数据中发现文字换行符/回车符

标签 postgresql python-3.x csv pandas newline

我有以下文本文件,每行末尾都有 CRLF,并且有相对较少的坏行(b'跳过第 55000 行:预期 14 个字段,看到 15\n')。

0.0;0.7;John;0.29
1.0;0.23;Mike;0.55
0.0;0.72;;Jane;;-3.4
0.0;0.98;Gil;0.68
0.0;0.48;;;0
1.0;0.34;Karl;0.73
0.0;0.44;James;0.06
1.0;0.4;Kiki;0.74
0.0;0.18;Albert;0.18
1.0;0.53;Mark;0.53

我使用 pandas、python 3.5.2 for windows 10 导入文件如下:

with open('E:\DATA\my_file.txt','rb') as f:
    df = pd.read_csv(f, sep=';', encoding='CP1252', error_bad_lines=False) // skipping bad rows

df 看起来像这样://坏行现在似乎是空的

0.0;0.7;John;0.29
1.0;0.23;Mike;0.55

0.0;0.98;Gil;0.68

1.0;0.34;Karl;0.73
0.0;0.44;James;0.06
1.0;0.4;Kiki;0.74
0.0;0.18;Albert;0.18
1.0;0.53;Mark;0.53

然后我将表格导出到 csv 中,如下所示:

with open('E:\DATA\csv_file.csv','w',newline='\n') as outfile:
    df.to_csv(outfile, sep=';',index = False, line_terminator = '\r')

csv_file.csv 看起来像这样://空行似乎已被删除

0.0;0.7;John;0.29
1.0;0.23;Mike;0.55
0.0;0.98;Gil;0.68
1.0;0.34;Karl;0.73
0.0;0.44;James;0.06
1.0;0.4;Kiki;0.74
0.0;0.18;Albert;0.18
1.0;0.53;Mark;0.53

不幸的是,当我使用以下代码将文件导入 postgres 时:

set client_encoding to 'WIN1252';
COPY my_table FROM 'E:\DATA\csv_file.csv' (DELIMITER(';'));

我收到以下错误:

ERROR:  literal newline found in data
HINT:  Use "\n" to represent newline.
CONTEXT:  COPY my_table, line 25408: ""

当我在 nopetad++ 中打开 csv_file 时,我看到它在每行的末尾都有“CR”,直到第 25407 行、第 25408 行和其他一些行的末尾都有“CRLF”。 我尝试了一些我在这个网站上读到的东西,比如以二进制模式打开文件,但没有任何帮助。

谁能给我解释一下这是怎么回事,我该如何解决这个问题?谢谢

最佳答案

UPDATE2:它运行良好:

In [194]: pd.read_csv(r'D:\download\onetest.txt', sep=';')
Out[194]:
   COL1  COL2    COL2.1        COL3  COL4  COL5      COL6    COL7 COL8  COL9  COL10
0    23  21.0        UP  15/08/1986  BOBO   NaN   1071001   268-Z  DON  1620    NaN
1  012R  65.0        UP  15/10/1986  ESTO   NaN  15065108   066-B  DON  8415    NaN
2   234   8.0  EIJFTERF  17/12/1989  KING   NaN  15571508  0776-V   UP  6329    NaN

更新:如果您的文件足够小以适合内存,您可以试试这个:

import io
data = []
with open(r'E:\DATA\my_file.txt') as f:
    for line in f:
        data.append(line.rstrip())
df = pd.read_csv(io.StringIO(data), sep=';', encoding='CP1252', error_bad_lines=False)
df.to_csv(r'E:\DATA\csv_file.csv', sep=';', index = False)

旧答案:

您正在使用 '\r' 作为换行符,而 PostgreSQL 的 COPY 命令需要 '\n',因此请尝试以下操作:

df = pd.read_csv(r'E:\DATA\my_file.txt', sep=';', encoding='CP1252', error_bad_lines=False)
df.to_csv(r'E:\DATA\csv_file.csv', sep=';', index = False)

在 PostgreSQL 中:

set client_encoding to 'WIN1252';
COPY my_table FROM 'E:\DATA\csv_file.csv' (DELIMITER(';'));

关于postgresql - 在用 pandas 导出到 csv 的数据中发现文字换行符/回车符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41200012/

相关文章:

python - Pandas value_count where 行名称

使用带有行名和列名的 fread 读取文件

sql - 对于每一行,查找之前的任何行是否包含更高的值

java - scala play 1.2.4 与 postgres 兼容吗?

mysql - 如何将列中的每个 NULL 值更新为零?

python - Numpy 数组到字典

postgresql - 如何在 PostgreSQL JDBC 连接上保持 float->String 转换的精度

mysql - 在实时机器上更新(或替换)整个数据库表的最佳方法是什么?

python-3.x - urllib3 - 超时和重试

csv 文件中的 Excel 尾随逗号错误