我正在从网上抓取数据,并将生成的内容写入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
我如何摆脱这个问题?
答案 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文件。