首页 > 编程语言 >【Python学习】Python csv 数据处理实例——bilibili 视频播放量跟踪

【Python学习】Python csv 数据处理实例——bilibili 视频播放量跟踪

时间:2024-11-12 21:18:00浏览次数:3  
标签:CSV Python writer 写入 bilibili print csv data

1. 理论知识准备

在 Python 中,处理 CSV(Comma-Separated Values)文件非常常见,因为 CSV 是一种广泛使用的数据交换格式。Python 标准库中的csv模块提供了读取和写入 CSV 文件的功能。以下是一些基本的使用方法。

读取 CSV 文件

首先,确保你的 CSV 文件是有效的,并且你知道其中数据的结构(例如,是否有标题行)。

import csv

# 打开CSV文件
with open('example.csv', newline='', encoding='utf-8') as csvfile:
    # 创建CSV阅读器
    csvreader = csv.reader(csvfile, delimiter=',')
    
    # 读取并打印每一行
    for row in csvreader:
        print(', '.join(row))


如果你的 CSV 文件包含标题行,你可能想使用csv.DictReader来将每一行作为字典读取,这样可以通过标题访问每个字段。

import csv

# 使用DictReader读取CSV文件
with open('example.csv', newline='', encoding='utf-8') as csvfile:
    csvreader = csv.DictReader(csvfile)
    
    # 读取并打印每一行作为字典
    for row in csvreader:
        print(row)  # 或者 print(row['列名']) 来访问特定列


写入 CSV 文件

写入 CSV 文件也很直接。你可以使用csv.writercsv.DictWriter(如果你希望以字典的形式写入行)。

import csv

# 要写入的数据
data = [
    ['姓名', '年龄', '城市'],
    ['Alice', '24', 'New York'],
    ['Bob', '27', 'Los Angeles'],
    ['Charlie', '22', 'Boston']
]

# 打开文件并写入
with open('output.csv', mode='w', newline='', encoding='utf-8') as file:
    writer = csv.writer(file)
    
    # 写入数据
    for row in data:
        writer.writerow(row)


使用csv.DictWriter写入字典数据到 CSV 文件:

import csv

# 要写入的数据(字典形式)
data = [
    {'姓名': 'Alice', '年龄': '24', '城市': 'New York'},
    {'姓名': 'Bob', '年龄': '27', '城市': 'Los Angeles'},
    {'姓名': 'Charlie', '年龄': '22', '城市': 'Boston'}
]

# 获取字典中的键名作为标题
fieldnames = data.keys()

# 打开文件并写入
with open('output_dict.csv', mode='w', newline='', encoding='utf-8') as file:
    writer = csv.DictWriter(file, fieldnames=fieldnames)
    
    # 写入标题
    writer.writeheader()
    
    # 写入数据
    for row in data:
        writer.writerow(row)


注意事项

  1. 文件编码‌:处理 CSV 文件时,确保指定正确的文件编码(如utf-8),特别是当文件中包含非 ASCII 字符时。
  2. 数据清洗‌:在读取或写入 CSV 文件之前,可能需要对数据进行清洗,例如去除多余的空格、处理缺失值等。
  3. 异常处理‌:使用try-except块来捕获并处理可能出现的异常,如文件不存在或读写权限问题。

通过掌握这些基本技能,你可以有效地在 Python 中处理 CSV 数据。

2. 实践案例

需求

跟踪 bilibili 视频播放量。

  1. 要获取视频的播放量等数据
  2. 要持久化跟踪,保存成文件是最好的方式。
  3. 便于后续数据分析处理,轻量化的csv是个不错的选择。

实践开始

创建一个函数来获取视频数据

# 获取数据
def get_data(bvid):
    headers = {
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36',
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
        'Accept-Language': 'zh-CN,zh;q=0.9',
        'Accept-Encoding': 'gzip, deflate, br',
        'Origin': 'https://www.bilibili.com',
        'Connection': 'keep-alive'
    }
    resp = requests.get(f'https://api.bilibili.com/x/web-interface/view?bvid={bvid}', headers=headers).json()
    # print(resp['data']['stat'])
    return resp['data']

准备一个含有视频bvids的文本,bilibili_all.txt

# 读取文件,导入所有bvids
def read_file():
    with open(r'bilibili_all.txt', 'r') as f:
        content = f.read()

    bvids = content.split(',')
    print(bvids)
    data = []
    for bvid in bvids:
        data.append(get_data(bvid))
        time.sleep(1)

    return data

基本的数据准备完成了,还需要一个时间标记

# 时间戳转时间
def timestampToTime(timestamp):
    timeArray = time.localtime(timestamp)
    timeStr = time.strftime("%Y-%m-%d %H:%M:%S", timeArray)
    return timeStr

生成一份数据模板,后续可持续添加数据

# 将当前时间点的播放量写入到文件
def writecsv(data, filename):
    try:

        with open(filename, mode='w', newline='', encoding='utf-8') as file:
            
            writer = csv.writer(file)
            viewdata = timestampToTime(int(time.time()))
            head = ['bvid', 'title', viewdata]
            writer.writerow(head)
            
            for vdata in data:
                writer.writerow([vdata['bvid'], vdata['title'], vdata['stat']['view']])

    except Exception as e:
        print(f"Error writing log file: {e}")


    # print((timestampToTime(int(time.time())) + "\n"))
    #
    # print("bvid\ttitle\tview")
    # for vdata in data:
    #     print("{}\t{}\t{}\n".format(vdata["bvid"], vdata["title"], vdata['stat']["view"]))

模板:

获取新数据,并追加写入

# 新数据处理

def handle_data(data):
    new_column_data = [timestampToTime(int(time.time()))] + [item['stat']['view'] for item in data]
    return new_column_data

# 写入追加新列数据

def writecsv_append(data, filename):
    try:
        # 读取文件内容
        with open(filename, mode='r', newline='', encoding='utf-8') as infile:
            reader = csv.reader(infile)
            rows = list(reader)

        # 处理数据
        new_column_data = handle_data(data)

        # 检查数据长度是否匹配
        if len(rows) != len(new_column_data):
            raise ValueError("数据长度与文件行数不匹配")

        # 写入新内容
        with open(filename, mode='w', newline='', encoding='utf-8') as outfile:
            writer = csv.writer(outfile)
            for row, newvalue in zip(rows, new_column_data):
                row.append(newvalue)
                writer.writerow(row)

        print("写入结束")

    except FileNotFoundError:
        print(f"文件未找到: {filename}")
    except ValueError as ve:
        print(f"值错误: {ve}")
    except Exception as e:
        print(f"写入日志文件时发生错误: {e}")

测试成果

if __name__ == '__main__':
    data = read_file()
    # writecsv(data, "log_all.csv")
    writecsv_append(data, "log_all.csv")

后续展望

基本实现了跟踪bilibili 视频播放量的需求,但还有一些需要改进的地方。比如视频bvids文本发生变化时可能会出现错误。时间格式修改成日期,便于按日追踪。

标签:CSV,Python,writer,写入,bilibili,print,csv,data
From: https://blog.csdn.net/asy_litscorpi/article/details/143723294

相关文章

  • 【python基础收尾篇】python基础试卷 #试卷分析
     python基础篇收尾了,让我们给自己一个检测吧!(后文解析)python基础试卷一、选择题【15*1=15分】1. Python中的“深拷贝”与“浅拷贝”不同在于:A.深拷贝比浅拷贝执行速度快B.深拷贝允许修改原始对象,而浅拷贝不允许C.深拷贝创建对象的副本及其嵌套对象的副本......
  • 【Playwright + Python】系列(十)利用 Playwright 完美处理 Dialogs 对话框
    哈喽,大家好,我是六哥!今天我来给大家分享一下如何使用playwight处理Dialogs对话框,面向对象为功能测试及零基础小白,这里我尽量用大白话的方式举例讲解,力求所有人都能看懂,建议大家先收藏,以免后面找不到。......
  • python-27-Python ORM系列之彻底搞明白ORM概念,对ORM进行封装结合FastAPI实现数据库的
    python-27-PythonORM系列之彻底搞明白ORM概念,对ORM进行封装结合FastAPI实现数据库的增删改查,联表查询等接口一.简介在Python基础系列ORM部分为大家介绍了如何搭建MySQL数据和MySQL一些访问配置,同时也介绍了pymysql库的封装来实现对数据库的增删改查功能,但是截止以上都没......
  • 第六课 Python之模块
    一、模块的介绍(1)python模块,是一个python文件,以一个.py文件,包含了python对象定义和pyhton语句(2)python对象定义和python语句(3)模块让你能够有逻辑地组织你的python代码段。(4)把相关的代码分配到一个模块里能让你的代码更好用,更易懂(5)模块能定义函数,类和变量,模块里也能包含可执行的......
  • python 工作中常用技巧
    json格式化后中文乱码问题在Python中,使用json.dumps()将数据序列化为JSON字符串时,默认情况下,非ASCII字符(包括中文字符)会被转义为Unicode码点(例如\uXXXX)。这是为了确保生成的JSON字符串在任何环境中都是有效的,并且能够被正确解析。如果你希望生成的JSON字符串直接包含中文字符......
  • [AIGC]使用阿里云Paraformer语音识别录音识别 API 进行音频处理 —— 完整流程及代码
    文章目录一、前提准备1.阿里云账号2.开通录音识别服务3.获取APIKey和AccessToken二、阿里云录音识别API的主要功能介绍三、完整代码流程1.导入依赖库2.设置环境变量3.生成Token4.上传文件并发起识别请求4.1请求4.2请将'{api-key}'替换为你的apikey,'{ta......
  • Python连接VNC
    #-*-coding:utf-8-*-"""安装命令:pipinstallopencv-pythonvncdotool-ihttps://mirrors.aliyun.com/pypi/simple"""importctypesimporttimefromloggingimportshutdownimportrandomimportcv2,numpyasnpfromvncdotool......
  • 【PAT_Python解】1125 子串与子列
    原题链接:PTA|程序设计类实验辅助教学平台Tips:以下Python代码仅个人理解,非最优算法,仅供参考!多学习其他大佬的AC代码!测试点5超时:defmin_window_substring(s,p):len1=len(s)len2=len(p)mixn=0min_length=len1+1#设置为一个较大的值......
  • debian11 使用python3 启动http文件服务器和ftp服务器脚本
    http文件服务器start_http_server.sh#!/bin/bashport=$1host=0.0.0.0functionUsage(){echo-e"Usage:${0}[port]"exit0}if[[${port}==""]];thenUsagefi#检查端口号是否被占用check_port=`netstat-ant|grepLISTEN|grep${port}......
  • Python科学计算的利器:Scipy库深度解析
    Python科学计算的利器:SciPy库深度解析在数据科学、工程计算和数学建模领域,Python的SciPy库是不可或缺的强大工具。SciPy以NumPy为基础,提供了丰富的函数和算法,用于数值积分、优化、线性代数、信号处理等科学计算任务。本文将详细介绍SciPy库的核心模块和功能,帮助你深入理解......