【Python3学习】3.这个超大文本文件有多少行?文件头是啥?前几行写了啥?

解说方式: 在程序源码中大量加入“#”注释进行讲解。

太长不看版本

拿到一个超百万行或者几个G的csv文件,EXCEL打不开,不知道有多少行,里面写了啥也不懂,这可咋整。

案例数据准备

用文本编辑器输入以下内容,另存为D:\workspace\in.csv

1
2
3
4
5
6
7
8
9
10
11
userid,loginaddr,starttime,state
123,a1,20230128,SUC
124,a2,20230128,SUC
125,a3,20230128,SUC
126,a4,20230128,SUC
127,a5,20230128,SUC
128,a6,20230128,SUC
129,a7,20230128,FAIL
110,a8,20230128,SUC
123,a1,20230128,SUC
...pretend to,have 2000000,rows,SUC

具体操作

  1. 选择路径运行ipython
  2. 查看表头方法一:使用Pandas
  3. 查看表头方法二:with open逐行读取
  4. 了解csv文件有几行

拿到的几个G文件里面都有啥?

中午新员工小马接到通知,要求配合公司审计工作,限期24小时提取后台百万级用户最新登录日志信息给审计组,审计人员要求提供的数据是文本文件,标注数据量,并且写一个数据字典给他们,方便他们导入数据库进行后续稽核。

小马虽然是个非技术出身的新兵蛋子,但是“遇事不明找厂家解决”的祖传经验早已烂熟于心,邮件一转、电话与厂家简单交代一番后,小马转身就投入到每日紧张的~~摸鱼~~工作中了。

临近下班领导也千交代万嘱咐地让他跟好进度,小马抄起电话就是一通催命,厂家说数据量很大而且今晚还有割接,没法那么快提供,不过还是信誓旦旦表示明早一定提供,小马看看还有时间,也就放心下班了。

次日上班,小马早早打开邮箱,看到厂家已经通过移动云盘转了一个几个G的csv文件,心里的石头也放下了,刚想转文件给审计,愕然发现厂家没有提供数据字典和数据量,协调其他人也叫不醒昨天导数的厂家,时间也不允许重新安排人员导数,小马此时急得像火锅上的螃蟹,正准备抓一个厂家祭天,一旁的胖驼按下了他手中四十米的大刀,关切地问有什么问题。

“审计中午急要的数据,厂家给我导了数,但是不告诉我有多少行,也没给我数据字典,你说我能不急吗?”小马说罢举刀又要和厂家拼命。

“既然那么着急,你自己看有多少行,自己写个简单的数据字典不就行了?”胖驼~~抢过刀踢远后~~不解地问道。

“几个G的文件,我EXCEL打开电脑都要死了,而且数据肯定都超过104万行了,这还怎么看?”小马答道。

“处理文本文件这还不简单,编程看一下不就行了。”胖驼松了一口气,“叫你早点数字化转型,学点Python,比你现在学刀法不知道强到哪里去。”

“那想必驼哥您这是有解药?还望不吝赐教!”小马关切地问。

“有是有,但是得自己学习自己动手哦。”胖驼语重心长地说。

“您说这是要上刀山还是下油锅,小马我在所不辞。”

“之前的几篇Python入门文章都看了么?”

“看是看了,但是不知道如何下手,看了后面忘了前面,没感觉对工作有什么帮助。”小马便挠头边说。

你那是缺乏应用,多写就知道怎么用了。 我写个案例给你看看,你自己举一反三即可。”胖驼不紧不慢地说到,“你这种简单文本处理,我们用ipython敲几行就能解决, 都用不到什么IDE了。首先,你打开Anaconda Prompt,进入你下载这个几个G文件的路径,然后运行ipython。”

选择路径运行ipython

大文件路径为D:\workspace\in.csv,我们先运行Anaconda Prompt,依次输入:

1
2
3
D:
cd D:\workspace
ipython

查看表头方法一:使用Pandas

第一个方法语句较为简单,我们可以利用Pandas包,帮我们解析和读取相关文件前几行内容。Pandas包功能强大,如果文件不是那么大,该方法甚至能直接读取行数。

1
2
3
4
5
6
# #是注释,即#后的内容python程序不会执行,一般将解释放在#后面
import pandas as pd # 导入pandas库,简写为pd
in_file = r"D:\workspace\in.csv" # 英文字符双引号""或者单引号''中间内容是字符串,前面加上一个r就意味着引号内字符串是什么就保持原样,不要【转义】。
ENCODING = 'gbk' # 1. 一般来说用全大写作为常量。2. gbk是一种编码,编码问题永远是编程中的痛,这个以后再说,目前只要知道我们常用'gbk'、'utf-8'这两种计算机编码即可,只要出现编码错误,我们就换成另一种编码尝试即可,如果都不行就考虑处理乱码原因,甚至直接使用逐行二进制读取形式解决。
df = pd.read_csv(in_file,nrows=5,sep=',',encoding=ENCODING) # 用pandas中的read_csv方法读取文件,只读前5行(含表头),每个字符用“,”隔开,使用ENCODING编码运行,将读取结果存入df变量
df # 直接在ipython中写变量名称,可以直接显示变量内容,类似于`print(df)`

查看表头方法二:with open逐行读取

我们还可以用python的open语句打开csv文件,逐行读取,并将读取结果展示在界面上。

1
2
3
4
5
6
7
8
9
10
# 用等号可以赋值,即将r"D:\workspace\in.csv"赋值给in_file,类似x=5
in_file = r"D:\workspace\in.csv" # 英文字符双引号""或者单引号''中间内容是字符串(""""""三引号中间也可以),前面加上一个r就意味着引号内字符串是什么就保持原样,不要【转义】。
ENCODING = 'gbk' # 一般来说用全大写作为常量。gbk是一种编码,编码问题永远是编程中的痛,这个以后再说,目前只要知道我们常用'gbk'、'utf-8'这两种计算机编码即可,只要出现编码错误,我们就换成
with open(in_file,mode='r',encoding=ENCODING) as f_in: # with语法是一种上下文管理协议,用在这里这句意思就是用只读(r)模式,用ENCODING编码打开in_file文件,赋值给f_in。如果不用with可以参看[Python3 File 方法 | 菜鸟教程 (runoob.com)](https://www.runoob.com/python3/python3-file-methods.html)了解open语句的用法。
i = 0 # 用i来计数,这里也能看到python不是用大括号,而是用空格/tab缩进来表示代码块,来表示代码块,比如我采用的是4个空格
for line in f_in: # 循环语句,也就是逐行读取f_in的内容,所谓逐行就是遇到'\n'等换行符则作为一行,for语法详见[Python3 循环语句 | 菜鸟教程 (runoob.com)](https://www.runoob.com/python3/python3-loop.html)
i+=1 # 等同于i=i+1,是一种简略写法
print(line) # 在控制面板呈现这一行内容,print()是新手最常用的语句之一了吧
if i > 5: # 条件语句,如果i的值超过5,则执行冒号后内容,if语法详见[Python3 条件控制 | 菜鸟教程 (runoob.com)](https://www.runoob.com/python3/python3-conditional-statements.html)
break # 跳出所在循环语句

了解csv文件有几行

聪明如你应该已经发现在查看表头方法一:with open逐行读取中,只要不print内容,不设置5行后跳出循环,就可以得到整个文件有多少行了,只要减去表头的1行,就知道有多少数据量了。

不过这里我们尝试不解码直接二进制读取行数,好处就是不会有编码解析失败报错停止问题。

1
2
3
4
5
6
in_file = r"D:\workspace\in.csv" # 一样
with open(in_file,mode='rb') as f_in: # 用二进制读(rb)模式打开in_file文件,赋值给f_in,因为是直接文本读取成二进制,就不需要编码字段了。如果要了解编码问题,可以抽空看看:[你懂乱码吗?锟斤拷烫烫烫(详解ASCII、Unicode、UTF-32、UTF-8编码)_哔哩哔哩_bilibili](https://www.bilibili.com/video/BV1xP4y1J7CS/?vd_source=b0234d8ee12e69e42c285e8db9242a72)
i = 0 # 用i来计数
for line in f_in: # 循环语句,通过b'\n'来判断行,注意单引号前面有个b,就是byte的意思,b'\n'和'\n'还是不一样的,后者才是字符串
i+=1 # 等同于i=i+1
print(f"文件'{in_file}'一共有{i-1}行") # [Python新式格式化输出:f-string - 知乎 (zhihu.com)](https://zhuanlan.zhihu.com/p/140898888)

通过上述几个步骤,小马很快地自己编程,看到了超大文件的表头样式,并依葫芦画瓢写了个简单的数据字典,在中午前补上了相关数据和附件,皆大欢喜。

使用搜索:必应百度