怎么测自己qq号测吉凶号令天下多少钱

问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
用csv库写入两列数据,但是却出现place列的部分数据会跑到name里面,place还有很多空值,这是为什么呢?
我的代码如下:
import csv
name=['lucy','jacky','eric','man','san']
place=['chongqing','guangzhou','beijing','shanghai','shenzhen']
with open('credit_test.csv','w') as file:
file.write('name,place\n')
file.write("{name},{place}\n".format(name='\n'.join(name),place='\n'.join(place)))
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
既然 import csv,就用 csv 来写啊~
import csv
name=['lucy','jacky','eric','man','san']
place=['chongqing','guangzhou','beijing','shanghai','shenzhen']
with open('credit_test.csv','w') as file:
w = csv.writer(file)
w.writerow(('name','place'))
w.writerows(zip(name,place))
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
原因是你把换行写到了每个name的后面。这个格式是错的。
name=['lucy','jacky','eric','man','san']
place=['chongqing','guangzhou','beijing','shanghai','shenzhen']
with open('credit_test.csv','w') as file:
file.write('name,place\n')
for n,p in zip(name,place):
file.write("{},{}\n".format(n,p))
同步到新浪微博
分享到微博?
你好!看起来你挺喜欢这个内容,但是你还没有注册帐号。 当你创建了帐号,我们能准确地追踪你关注的问题,在有新答案或内容的时候收到网页和邮件通知。还能直接向作者咨询更多细节。如果上面的内容有帮助,记得点赞 (????)? 表示感谢。
明天提醒我
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:
扫扫下载 AppPython实现 多进程导入CSV数据到 MySQL
作者:李林克斯
字体:[ ] 类型:转载 时间:
本文给大家分享的是使用python实现多进程导入CSV文件数据到MySQL的思路方法以及具体的代码分享,有相同需求的小伙伴可以参考下
前段时间帮同事处理了一个把 CSV 数据导入到 MySQL 的需求。两个很大的 CSV 文件, 分别有 3GB、2100 万条记录和 7GB、3500 万条记录。对于这个量级的数据,用简单的单进程/单线程导入 会耗时很久,最终用了多进程的方式来实现。具体过程不赘述,记录一下几个要点:
批量插入而不是逐条插入
为了加快插入速度,先不要建索引
生产者和消费者模型,主进程读文件,多个 worker 进程执行插入
注意控制 worker 的数量,避免对 MySQL 造成太大的压力
注意处理脏数据导致的异常
原始数据是 GBK 编码,所以还要注意转换成 UTF-8
用 click 封装命令行工具
具体的代码实现如下:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import codecs
import csv
import logging
import multiprocessing
import warnings
import click
import MySQLdb
import sqlalchemy
warnings.filterwarnings('ignore', category=MySQLdb.Warning)
# 批量插入的记录数量
BATCH = 5000
DB_URI = 'mysql://root@localhost:3306/example?charset=utf8'
engine = sqlalchemy.create_engine(DB_URI)
def get_table_cols(table):
sql = 'SELECT * FROM `{table}` LIMIT 0'.format(table=table)
res = engine.execute(sql)
return res.keys()
def insert_many(table, cols, rows, cursor):
sql = 'INSERT INTO `{table}` ({cols}) VALUES ({marks})'.format(
table=table,
cols=', '.join(cols),
marks=', '.join(['%s'] * len(cols)))
cursor.execute(sql, *rows)
('process %s inserted %s rows into table %s', os.getpid(), len(rows), table)
def insert_worker(table, cols, queue):
# 每个子进程创建自己的 engine 对象
cursor = sqlalchemy.create_engine(DB_URI)
while True:
row = queue.get()
if row is None:
insert_many(table, cols, rows, cursor)
rows.append(row)
if len(rows) == BATCH:
insert_many(table, cols, rows, cursor)
def insert_parallel(table, reader, w=10):
cols = get_table_cols(table)
# 数据队列,主进程读文件并往里写数据,worker 进程从队列读数据
# 注意一下控制队列的大小,避免消费太慢导致堆积太多数据,占用过多内存
queue = multiprocessing.Queue(maxsize=w*BATCH*2)
workers = []
for i in range(w):
p = multiprocessing.Process(target=insert_worker, args=(table, cols, queue))
workers.append(p)
('starting # %s worker process, pid: %s...', i + 1, p.pid)
dirty_data_file = './{}_dirty_rows.csv'.format(table)
xf = open(dirty_data_file, 'w')
writer = csv.writer(xf, delimiter=reader.dialect.delimiter)
for line in reader:
# 记录并跳过脏数据: 键值数量不一致
if len(line) != len(cols):
writer.writerow(line)
# 把 None 值替换为 'NULL'
clean_line = [None if x == 'NULL' else x for x in line]
# 往队列里写数据
queue.put(tuple(clean_line))
if reader.line_num % 500000 == 0:
('put %s tasks into queue.', reader.line_num)
xf.close()
# 给每个 worker 发送任务结束的信号
('send close signal to worker processes')
for i in range(w):
queue.put(None)
for p in workers:
def convert_file_to_utf8(f, rv_file=None):
if not rv_file:
name, ext = os.path.splitext(f)
if isinstance(name, unicode):
name = name.encode('utf8')
rv_file = '{}_utf8{}'.format(name, ext)
('start to process file %s', f)
with open(f) as infd:
with open(rv_file, 'w') as outfd:
lines = []
chunck = 200000
first_line = infd.readline().strip(codecs.BOM_UTF8).strip() + '\n'
lines.append(first_line)
for line in infd:
clean_line = line.decode('gb18030').encode('utf8')
clean_line = clean_line.rstrip() + '\n'
lines.append(clean_line)
if len(lines) == chunck:
outfd.writelines(lines)
lines = []
('processed %s lines.', loop * chunck)
outfd.writelines(lines)
('processed %s lines.', loop * chunck + len(lines))
@click.group()
def cli():
logging.basicConfig(,
format='%(asctime)s - %(levelname)s - %(name)s - %(message)s')
@mand('gbk_to_utf8')
@click.argument('f')
def convert_gbk_to_utf8(f):
convert_file_to_utf8(f)
@mand('load')
@click.option('-t', '--table', required=True, help='表名')
@click.option('-i', '--filename', required=True, help='输入文件')
@click.option('-w', '--workers', default=10, help='worker 数量,默认 10')
def load_fac_day_pro_nos_sal_table(table, filename, workers):
with open(filename) as fd:
fd.readline()
# skip header
reader = csv.reader(fd)
insert_parallel(table, reader, w=workers)
if __name__ == '__main__':
以上就是本文给大家分享的全部没人了,希望大家能够喜欢
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具更多数码资讯,请关注南窗数码
“数据文件”相关经验&最近的工作总是跟数据打交道,需要经常比较一些CSV文件,这些CSV文件其实都需要被LOAD到数据库里面,所以也就是一堆堆的数据文件需要比较。暂时没有发现有比较好用的现成的CSV比较工具,自己动手用Python做了一个凑合能用的。思想比较简单,就是把CSV文件的内容读取出来,保存为一个list,然后把2个CSV文件所生成的list进行对比。有个特殊的需求,就是对于CSV文件中一些肯定不一样的列,例如process date这样的字段,是需要跳过的。由于本地生成的CSV文件比较小,刚开始没有注意到如果文件太大的话会占用很多的内存。最开始的版本是:def readcsv2list(filename, rows):
fileobj = open(filename, 'rb')
csvreader = csv.reader(fileobj)
retlist = []
for row in csvreader:
clist = []
selected_rows = [ic for ic in range(len(row)) if ic not in rows]
for c in selected_rows:
clist.append(row[c])
retlist.append(clist)
fileobj.close()
return retlist后来用这个脚本比较生产环境数据的时候就遇到问题了,其中最大的一个数据文件大概是1.5GB,这只是文件大小,把文件转成list以后所占用的内存会翻几倍(这个很容易理解,整数1在文件里面站1个字节,放到list里面就要4个字节了)。一下子把机器的内存用光了。随后找了一下文档,csv.reader是没有一个方法可以指定一次读取若干行数据的。后来就利用file object有一个readline()方法,通过一个参数来控制一次读取多少行的记录,从而达到控制内存使用量的目的。需要的注意的点有:1. 在读完若干行数据以后,需要获取一下当前这个file object的位置,Python提供了.tell()方法来获取这个值;2. 读取文件的时候需要知道上一会读到什么地方了,并且从那里继续往下读,用到了.seek()方法;3. readline()方法在读到文件末尾的时候只会返回一个空字符,所以需要对这个空字符做一点处理。def readcsv2list(filename, rows, last_position, max_line):
fileobj = open(filename, 'rb')
fileobj.seek(last_position)
datalines = []
for i in range(max_line):
line_itme = fileobj.readline()
if len(line_itme) & 0:
datalines.append(line_itme)
csvreader = csv.reader(datalines)
retlist = []
for row in csvreader:
clist = []
selected_rows = [ic for ic in range(len(row)) if ic not in rows]
for c in selected_rows:
clist.append(row[c])
retlist.append(clist)
current_position = fileobj.tell()
fileobj.close()
return retlist, current_positionPython,尤其是低版本(例如我们用的2.4.3),对于在程序里面显式地del一些变量(通常是个大list之类),是不会立刻释放内存的,所以对于处理数据量比较大的case的时候就需要特别注意内存的使用。参考文章:
Related posts:8754人阅读
python(73)
在使用python对文件操作的过程中,你肯定碰到过对csv文件的操作,下面就python对csv文件的操作进行详述。
CSV(Comma-Separated Values)逗号分隔符,也就是每条记录中的值与值之间是用分号分隔的。
一, 打开CSV文件并写入一行数据
&import csv
&c=open("url.csv","w")
&writer=csv.write(c)
&writer.writerow(['name','address','city','state'])
这里的操作是实现csv文件的打开以及写入一行数据,首先是导入csv模块,(如果没有安装csv模块,可以参考模块的安装方式 包括 和 )
然后,使用csv的open函数以w(写入)方式打开,如果该csv文件不存在 则会在相对目录中创建一个csv文件。然后实例化一个写入对象writer,最后是使用writerow函数写入一条记录。
这里写入的数据也可以使用列表数据类型list,举例说明一下:
&rlist.append('name')
&rlist.append('address')
&rlist.append('city')
&rlist.append('state')
&writer.writerow(rlist)
#这里主要是方便写入数据的格式
&c.close()
在写入数据的时候可能会由于字符编码的原因导致输入的数据出现乱码,解决的方式有两种,一种可以通过先处理存入的数据的编码格式,,这里不再详述;另一种方式为在将数据写入到csv的时候利用csv设置写入字符地编码方式,如下所示添加命令行:
&import csv
&c=open("url.csv","w")
&c.write('\xEF\xBB\xBF')
&writer=csv.write(c)
&writer.writerow(['name','address','city','state'])
二, 读取CSV文件
import csv
c=open("url.csv","rb")
read=csv.reader(c)
for line in read:
print line[0],line[1]
for语句实现了遍历csv.reader读取的数据,然后通过print输出。这里的line代表读取的一行数据,line[0]表示改行数据的第一个属性列对应的值。
另外,对于打开csv文件的方式,这里只是介绍了’w’和’rb’两种方式,详细的打开方式讲解可以查看
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:342553次
积分:5854
积分:5854
排名:第4025名
原创:99篇
转载:51篇
评论:24条
(4)(1)(12)(6)(3)(2)(10)(1)(24)(14)(57)(8)(4)(5)

我要回帖

更多关于 qq号测吉凶号令天下 的文章

 

随机推荐