在Python中写入CSV时列的意外拆分

时间:2019-05-04 20:09:52

标签: python csv

我正在从网上抓取数据,并将生成的内容写入csv。这是我正在使用的代码:

#define LEN_HOLE 5
int fd = open ("file.bin", O_CREAT | O_RDWR | O_PATH | O_DIRECT, 0777);

off_t size = lseek (fd,0,SEEK_END);
off_t hole = lseek(fd,0,SEEK_HOLE);

ftruncate(fd,size+LEN_HOLE);

if(size==hole) return hole;

fallocate(fd, FALLOC_FL_COLLAPSE_RANGE, hole, LEN_HOLE);

///// or /////

uint64_t hint;
int ret;

ret = fcntl(fd, F_GET_FILE_RW_HINT, &hint);
if (ret < 0) {
    perror("fcntl: F_GET_FILE_RW_HINT");
    return -1;
}

uint64_t set_hint = (uint64_t) size;
ret = fcntl(fd, F_SET_FILE_RW_HINT, &set_hint);
if (ret < 0) {
    perror("fcntl: F_SET_FILE_RW_HINT");
    return -1;
}

这里的问题是由于某种原因,python在检测到with open('main_data.csv', 'a', newline='') as csv_file: writer = csv.writer(csv_file, delimiter="^") writer.writerow([patent_number, patent_type, grant_date, grant_country, app_number, app_country, \ application_date, for_num, for_date, for_ctry , int_classes, us_classes, title, n_of_claims, \ fields_of_search, n_of_drawings, inventor_names, inventor_address, \ assignee_names, assignee_address, attorn_names, primary_names, secondary_names]) 后开始将内容写入新列。特别是:

;之后,它将Korenaga保留在第一列中,并以Nobushige开始新列。对于以下输入相同

inventor_name = Korenaga; Nobushige

我如何摆脱这个问题?

1 个答案:

答案 0 :(得分:0)

为避免列识别出现问题,您可以使用quotechar引用列。

with open("main_data.csv", "a", newline="") as csv_file:
    writer = csv.writer(csv_file, delimiter="^", quotechar="\"")
    # some code
    pass

更新。

通过进一步的交谈,我们发现代码可以正常工作(有问题的代码也可以工作)。问题出在Excel中,它可以将;视为分隔符,并将数据划分为单独的列。

writer对象的构造函数允许您传递dialect参数。默认值为excel。正如我们在docs中看到的:

  

excel类定义Excel生成的CSV文件的常规属性。它以方言名称“ excel”注册。

因此,解决方案非常简单-从csv.writer删除所有参数,除了第一个。

writer = csv.writer(csv_file)

作为结果,我们将获得与Excel兼容的csv文件。