Pandas分块读取大文件以及读写csv,txt文件的实用操作(待更新)

一、前言

经常利用python编写数据处理脚本,而且经常需要从外界读取csv,txt等格式的文件。而且需要读取的文件很大,比如十几个g的大文件。这时候不能利用pandas直接读取,否则会给电脑内存造成太大的压力。因此就需要进行分块处理以及一边处理一边吧处理的结果写入文件的方式。

二、Pandas读写txt以及csv文件的实用操作

2.1 读取csv文件的参数详解(部分实用参数详解,其他的用到可以再查文档)

读取csv文件的相关参数:

pandas.read_csv(filepath_or_buffer, sep=', ', delimiter=None, header='infer', names=None, index_col=None, usecols=None, squeeze=False, prefix=None, mangle_dupe_cols=True, dtype=None, engine=None, converters=None, true_values=None, false_values=None, skipinitialspace=False, skiprows=None, skipfooter=0, nrows=None, na_values=None, keep_default_na=True, na_filter=True, verbose=False, skip_blank_lines=True, parse_dates=False, infer_datetime_format=False, keep_date_col=False, date_parser=None, dayfirst=False, iterator=False, chunksize=None, compression='infer', thousands=None, decimal=b'.', lineterminator=None, quotechar='"', quoting=0, doublequote=True, escapechar=None, comment=None, encoding=None, dialect=None, tupleize_cols=None, error_bad_lines=True, warn_bad_lines=True, delim_whitespace=False, low_memory=True, memory_map=False, float_precision=None)

filepath_or-buffer(读取路径参数):可以是URL,可用URL类型包括:http, ftp, s3和文件。对于多文件正在准备中本地文件读取实例:😕/localhost/path/to/table.csv。(必备参数)

sep(读取分隔符参数):默认分隔符为‘,’。分隔符长于一个字符并且不是‘\s+’,将使用python的语法分析器。并且忽略数据中的逗号。正则表达式例子:’\r\t’,常用到的分隔符为:’,’,’;’,’ '(逗号,分号,空格,制表符等)(常用参数)

delimiter : str,default None,定界符,备选分隔符(如果指定该参数,则sep参数失效)(不常用)

header:int or list of ints, default ‘infer’,指定行数用来作为列名,数据开始行数。如果文件中没有列名,则默认为0,否则设置为None。

names:array-like, default None用于结果的列名列表,如果数据文件中没有列标题行,就需要执行header=None。(不常用)

index_col: int or sequence or False, default None,指定用作行索引的列编号或者列名,如果给定一个序列则有多个行索引。(不常用)

usecols : array-like, default None返回一个数据子集,该列表中的值必须可以对应到文件中的位置(数字可以对应到指定的列)或者是字符传为文件中的列名。例如:usecols有效参数可能是 [0,1,2]或者是 [‘foo’, ‘bar’, ‘baz’]。使用这个参数可以加快加载速度并降低内存消耗。主要是可以用来读取限定列数据(常用参数)

prefix: str, default None,在没有列标题时,给列添加前缀。例如:添加‘X’ 成为 X0, X1, …(常用参数,列命名)

skiprows : list-like or integer, default None。需要忽略的行数(从文件开始处算起),或需要跳过的行号列表(从0开始)(常用参数)

nrows : int, default None 需要读取的行数(从文件头开始算起)(常用参数)

na_filter : boolean, default True 是否检查丢失值(空字符串或者是空值)。对于大文件来说数据集中没有空值,设定na_filter=False可以提升读取速度。(不常用)

** skip_blank_lines** : boolean, default True如果为True,则跳过空行;否则记为NaN。(不常用)

iterator : boolean, default False 返回一个TextFileReader 对象,以便逐块处理文件。(常用参数)(用于读取大文件)

chunksize : int, default None文件块的大小, See IO Tools docs for more informationon iterator and chunksize.(常用)(分块读取参数)

encoding : str, default None 指定字符集类型,通常指定为’utf-8’,‘GBK’. List of Python standard encodings(常用参数)

error_bad_lines : boolean, default True。如果一行包含太多的列,那么默认不会返回DataFrame ,如果设置成false,那么会将改行剔除(只能在C解析器下使用)。(常用,设置为False可以很好的跳过无法读取的值)

写csv文件的相关实用参数:

  • to_csv()是DataFrame类的方法,read_csv()是pandas的方法

路径 path_or_buf : A string path to the file to write or a StringIO

分隔符 sep: Field delimiter for the output file (default ”,”)一般设置为默认值;

是否保留某列数据 cols: Columns to write (default None)

dt.to_csv('C:/Users/think/Desktop/Result.csv',columns=['name']) #保存索引列和name列

是否保留列名 header: Whether to write out the column names (default True)(默认保留)(不保留设置header = 0)

是否保留行索引 index: whether to write row (index) names (default True)(默认保留)(不保留可以设置 index =0 或者index = None)

编码encoding 一般设置为‘utf-8’或者‘utf_8_sig’

2.2 pandas实现分块读取超大文件

  • pandas读取固定列(可以读取需要的数据)
xx = pd.read_excel('C:/Users/13109/Desktop/实习相关内容/任务10_论文关键词提取/data/dso_docmeta.xls',
                   usecols = ['id','titleText','abstracts'],header = 0,sep = ',',encoding ='utf-8')
  • pandas读取限定行(可以读取限定样本用于测试代码)(主要是nrows参数的使用)
yy = xx = pd.read_excel('C:/Users/13109/Desktop/实习相关内容/任务10_论文关键词提取/data/dso_docmeta.xls',
                   usecols = ['id','titleText','abstracts'],nrows = 10,header = 0,sep = ',',encoding ='utf-8')
  • 使用iterator=True参数可以返回一个TextFileReader对象,从而可以方便逐块读取文件

采用逐块读取文件的主要目的是防止文件过大,一次性加载到内存,会让内存爆掉,或者内存一次性无法加载这么多。此时就需要使用pandas逐块读取文件,并且逐块读取之后就可以将文件处理之后直接读出。这样就可以大大的节省内存空间的使用。

比如我们读入一个文件对其进行逐块读取,处理直接读出的操作:

"""
Created on Fri Nov 22 15:34:04 2019

@author: 13109
"""
import pandas as pd 
import time

start = time.time()


##采用分块读取的方法,主要用到参数chunksize,iterator参数(常用参数)
yy = pd.read_csv('G:/1.5知识图谱数据结果/paper_title_{}_new.csv'.format(0),
                   usecols = ['paper_id','title','abstract'],sep = ',',iterator=True,encoding ='utf-8')
#df = yy.get_chunk(200000)


loop = True
chunkSize = 100000
chunks = []
while loop:
    try:
        chunk = yy.get_chunk(chunkSize)
        chunk['abstract'].fillna('.',inplace =True)
        chunk['summary'] = chunk['title']+' '+chunk['abstract']
        chunk.drop(columns=['title','abstract'],inplace = True)
        chunks.append(chunk)
    except StopIteration:
        loop = False
        print("Iteration is stopped.")
        
df = pd.concat(chunks, ignore_index=True)

print("分块处理之后读取用时为:%0.2f s"%(time.time()-start))
  • 6
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

maligebilaowang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值