内置标准package

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'))

你可能感兴趣的:(内置标准package)