os模块
date 模块
import time
# 获取当前时间
time.time() # 返回的是一个时间戳
time.localtime() # 返回的是一个 time.struct_time 对象,默认情况下返回的是当前时间
time.localtime(1256677221) # 也可以传入一个时间戳,并将其转换为 time.struct_time 对象
time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) # strftime 必须接收一个 time.struct_time 对象作为参数
假设现在有一数据,数据格式如下图(数据来源于movielens/ml-latest/ratings.csv),数据有4个字段,分别是user_id,movie_id,rating,timestamp(评分提交的时间)
movielen_ratings.png
现在的需求是 timestamp 格式的时间不适合使用,需要将其转换为“yyyy-mm”的形式,时间转换的代码如下:
import sys
import time
file = sys.argv[1]
with open(file, 'r') as f:
for line in f:
ss = line.strip().split(',')
if len(ss) == 4:
user_id = ss[0].strip()
movie_id = ss[1].strip()
rating = ss[2].strip()
commit_time = ss[3].strip()
time_local = time.localtime(int(commit_time))
month = time.strftime("%Y-%m", time_local)
print('\t'.join([user_id, movie_id, rating, month]))
上述代码执行的过程中也发现一些问题:
1、Python 3中已经不在使用 long,直接使用 int 就好
2、在执行脚本的过程中注意去掉表头(即数据的第一行),不然会报 ValueError: invalid literal for int() with base 10 的错误
基于上面这个数据,假如还要进行按照月份来分割文件的话,可以考虑使用awk命令
使用 awk 进行文件切割
1. 注意文件编码需要是 utf-8, 必要时需要转码
2. 如果需要header信息的话,可以在切割之后再行添加header
3. 注意关闭文件,不然会报 makes too many open files 错误
awk -F'\t' 'NR>1{fname="ratings_"$4; print $0 >> fname; close(fname);}' ratings.format
awk -F'\t' '{fname="ratings_"$4; print $0 >> fname; close(fname);}' ratings.format
sys模块
sys模块有一个argv变量,用list存储了命令行的所有参数。argv至少有一个元素,因为第一个参数永远是该.py文件的名称。
运行 python hello.py 获得的sys.argv就是['hello.py'] # 当然这里 python 命令不算是参数
运行 python hello.py Michael 获得的sys.argv就是['hello.py', 'Michael']
如果想获取当前文件所在的目录:
import sys
sys.path.append(os.path.join(os.path.abspath(os.path.dirname(__file__)), 'hive'))