如何用Python处理大文件?

处理大文件的核心是避免一次性加载,采用逐行或分块读取,利用迭代器、生成器、pandas分块和mmap等方法实现流式处理,确保内存可控。

如何用python处理大文件?

在Python中处理大文件,最核心的思路就是“不要一次性把所有数据都加载到内存里”。无论是文本文件、日志还是大型数据集,我们都需要采用流式处理或分块处理的策略,避免内存溢出,确保程序稳定高效地运行。简单来说,就是一点一点地读,一点一点地处理,而不是一口气吃成个胖子。

解决方案

处理大文件的关键在于避免将整个文件内容一次性读入内存。Python提供了多种机制来实现这一点,其中最常用且高效的方式是利用迭代器和生成器。

一个直接的方法是逐行读取文件。Python的文件对象本身就是可迭代的,这意味着你可以直接在

for

循环中使用它来逐行处理文件,而不需要担心内存问题。

def process_large_text_file_line_by_line(filepath):    processed_count = 0    with open(filepath, 'r', encoding='utf-8') as f:        for line in f:            # 在这里对每一行进行处理            # 比如清洗数据、提取信息、写入新文件等            # print(f"Processing line: {line.strip()}")            processed_count += 1            if processed_count % 100000 == 0:                print(f"Processed {processed_count} lines...")    print(f"Finished processing {processed_count} lines.")# 示例调用# process_large_text_file_line_by_line('your_large_file.txt')

对于二进制文件或者需要固定大小块处理的情况,我们可以使用

read()

方法并指定每次读取的字节数,配合循环来实现分块读取。

立即学习“Python免费学习笔记(深入)”;

def process_large_binary_file_in_chunks(filepath, chunk_size=4096): # 4KB chunks    processed_bytes = 0    with open(filepath, 'rb') as f:        while True:            chunk = f.read(chunk_size)            if not chunk:                break # 文件读取完毕            # 在这里处理读取到的二进制块            # print(f"Processing chunk of size: {len(chunk)} bytes")            processed_bytes += len(chunk)            # 假设你可能需要将这些块写入另一个文件            # output_file.write(chunk)    print(f"Finished processing {processed_bytes} bytes.")# 示例调用# process_large_binary_file_in_chunks('your_large_binary_file.bin')

这些方法的核心思想都是将大文件“切片”处理,无论是逻辑上的行,还是物理上的字节块。这样做的好处是内存占用始终保持在一个可控的水平,不会随着文件大小的增长而线性增加。

为什么直接将大文件一次性读入内存是危险的?

这其实是个很直观的问题,但很多人在初学时容易忽略。当你用

file.read()

或者

file.readlines()

这样的方法去读取一个非常大的文件时,Python解释器会尝试把整个文件的内容,或者所有的行,一股脑地加载到你的计算机内存(RAM)中。如果文件只有几十MB,那通常没什么问题。但如果文件是几个GB,几十GB,甚至上百GB,你的内存很可能就不够用了。

想象一下,你的电脑只有8GB内存,而你却想加载一个10GB的文件。结果就是,程序会抛出

MemoryError

异常,或者更糟糕的是,系统会开始大量使用虚拟内存(硬盘作为内存的扩展),导致程序运行极其缓慢,甚至整个系统都卡死。这不仅仅是程序崩溃的问题,它还会严重影响用户体验和系统稳定性。我个人就遇到过因为不小心用

read()

读取了TB级别的日志文件,导致服务器瞬间“宕机”的尴尬经历,那次教训记忆犹新。所以,理解内存限制和避免这种“一口吃个胖子”的行为,是处理大文件最基本也最重要的常识。

Python处理大文件的核心策略:流式与生成器

面对大文件,Python的核心策略就是“流式处理”和巧妙利用“生成器”。这两种方式都是为了避免一次性加载全部数据到内存,而是按需、逐步地处理数据。

流式处理,顾名思义,就像水流一样,数据一点点地流过你的程序,你处理完一部分就放掉,再处理下一部分。最典型的就是文件对象的迭代器特性。当我们写

for line in file_object:

时,Python并不会一次性把所有行都读出来,而是每次迭代时才从文件中读取一行,处理完当前行后,内存中就只保留了这一行的数据,而不是整个文件。这种方式对内存极其友好。

生成器(Generators) 则是Python中实现流式处理的利器。它允许你定义一个函数,这个函数在每次被调用时不是返回一个值然后结束,而是“暂停”执行并“yield”一个值,下次被调用时再从上次暂停的地方继续执行。这使得生成器非常适合处理无限序列或大型数据集,因为它只在需要时才生成数据。

举个例子,假设我们有一个巨大的CSV文件,我们想筛选出某些行:

import csvdef filter_large_csv(filepath, condition_func):    """    一个生成器函数,用于从大型CSV文件中筛选行。    condition_func 是一个接受一行数据(字典)并返回True/False的函数。    """    with open(filepath, 'r', encoding='utf-8') as f:        reader = csv.DictReader(f) # 使用DictReader方便按列名访问        for row in reader:            if condition_func(row):                yield row # 满足条件的行才会被生成# 假设我们有一个名为 'large_data.csv' 的文件# 并且我们想筛选 'age' 列大于30的行def is_older_than_30(row):    try:        return int(row.get('age', 0)) > 30    except ValueError:        return False # 处理非数字的age值# 实际使用时:# for filtered_row in filter_large_csv('large_data.csv', is_older_than_30):#     print(filtered_row)#     # 在这里对筛选出的行进行进一步处理#     # 比如写入新的CSV文件,或者进行统计分析

这个

filter_large_csv

函数就是一个生成器。它不会把所有符合条件的行都收集到一个列表里再返回,而是每找到一行符合条件的就

yield

出来。这样,无论原文件有多大,只要你不是把所有

yield

出来的结果又全部存到一个列表里,内存占用就能保持在很低的水平。这种模式在处理日志、网络流或者任何无法一次性加载的数据源时都非常有效。

处理大型CSV或日志文件时有哪些高效方法?

对于大型CSV或日志文件,除了基本的逐行读取和生成器,我们还可以结合一些专门的库和技巧来提升效率和便利性。

1. Pandas分块读取CSV:如果你处理的是结构化的CSV文件,并且需要进行数据分析,

pandas

是一个非常强大的工具。虽然

pandas.read_csv()

默认会尝试加载整个文件,但它提供了一个

chunksize

参数,允许你分块读取数据。

import pandas as pddef process_large_csv_with_pandas_chunks(filepath, chunk_size=10000):    """    使用pandas分块读取并处理大型CSV文件。    """    total_rows_processed = 0    # iterator=True 返回一个TextFileReader对象,可以迭代    for chunk_df in pd.read_csv(filepath, chunksize=chunk_size):        # chunk_df 是一个DataFrame,包含chunk_size行数据        # 在这里对每个数据块进行处理        # 例如,计算每块的平均值,筛选数据,或者写入数据库        print(f"Processing a chunk of {len(chunk_df)} rows. Current total: {total_rows_processed + len(chunk_df)}")        # 示例:计算某个列的平均值        # if 'value_column' in chunk_df.columns:        #     avg_value = chunk_df['value_column'].mean()        #     print(f"Average value in this chunk: {avg_value}")        total_rows_processed += len(chunk_df)    print(f"Finished processing {total_rows_processed} rows in total.")# 示例调用# process_large_csv_with_pandas_chunks('your_large_data.csv')
chunksize

的魔力在于,它让你可以像处理普通DataFrame一样操作每个数据块,同时又避免了内存问题。你可以对每个

chunk_df

执行聚合、过滤、转换等操作,然后将结果累积起来。

2. 针对日志文件的模式匹配与状态机:日志文件通常是非结构化的,或者半结构化的。除了逐行读取,我们经常需要结合正则表达式来提取关键信息。如果日志条目跨越多行,你可能还需要构建一个简单的状态机来识别和组合完整的日志事件。

import redef parse_large_log_file(filepath, pattern):    """    逐行读取大型日志文件,并使用正则表达式提取匹配的内容。    """    compiled_pattern = re.compile(pattern)    with open(filepath, 'r', encoding='utf-8', errors='ignore') as f:        for line_num, line in enumerate(f, 1):            match = compiled_pattern.search(line)            if match:                # 假设你只想提取匹配到的所有捕获组                yield (line_num, match.groups())            # 也可以在这里处理没有匹配到的行,或者根据业务逻辑进行其他操作# 示例:提取Apache日志中的IP地址和请求路径# log_pattern = r'^(d{1,3}.d{1,3}.d{1,3}.d{1,3}) - - [.*?] "GET (.+?) HTTP'# for line_num, data in parse_large_log_file('access.log', log_pattern):#     ip_address, request_path = data#     # print(f"Line {line_num}: IP={ip_address}, Path={request_path}")

对于更复杂的日志结构,比如一个日志事件可能包含多行(例如,Java堆栈跟踪),你可以维护一个缓冲区,当识别到事件的开始和结束标记时,就处理缓冲区中的所有行。这本质上就是一种简单的状态机模式,确保你不会漏掉任何一个完整的日志事件。

3. 使用

mmap

进行内存映射:对于某些特定的场景,特别是需要随机访问大文件中的数据,或者文件非常大但你只需要处理其中一小部分时,

mmap

模块是一个高级选项。它将文件内容映射到进程的虚拟内存空间,让你能够像访问内存数组一样访问文件,而操作系统会负责按需加载文件页面。

import mmapimport osdef search_in_large_file_with_mmap(filepath, search_term):    """    使用mmap在大型文件中查找特定字符串。    """    with open(filepath, 'r+b') as f: # 'r+b' 允许读写二进制模式        # mmap.mmap(fileno, length, access=ACCESS_READ)        # length=0 意味着映射整个文件        with mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ) as mm:            # 搜索是字节串,所以search_term需要编码            index = mm.find(search_term.encode('utf-8'))            if index != -1:                print(f"Found '{search_term}' at byte offset: {index}")                # 你可以进一步读取该位置附近的数据                # 例如:print(mm[index:index+50].decode('utf-8'))            else:                print(f"'{search_term}' not found.")# 示例调用# if os.path.exists('your_large_text_file.txt'):#     search_in_large_file_with_mmap('your_large_text_file.txt', 'important_keyword')
mmap

的优势在于它避免了Python层面的文件IO开销,直接利用了操作系统的内存管理机制。但它也有其复杂性,例如需要处理字节串,并且不适合所有类型的处理(比如频繁写入)。

总的来说,处理大文件没有银弹,需要根据文件的具体类型、大小以及你想要执行的操作来选择最合适的方法。核心思想始终是避免一次性加载,转而采用流式、分块或按需访问的策略。

以上就是如何用Python处理大文件?的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1369722.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
迭代器(Iterator)与生成器(Generator)详解
上一篇 2025年12月14日 09:54:31
如何求一个数的平方根?
下一篇 2025年12月14日 09:54:45

相关推荐

  • 5G vs. 5G vs. 10G 网卡芯片实际吞吐量与CPU占用率测试

    5G vs. 5G vs. 10G 网卡芯片实际吞吐量与CPU占用率测试5G vs. 5G vs. 10G 网卡芯片实际吞吐量与CPU占用率测试5G vs. 5G vs. 10G 网卡芯片实际吞吐量与CPU占用率测试5G vs. 5G vs. 10G 网卡芯片实际吞吐量与CPU占用率测试

    5G与10G网卡能否跑满吞吐量取决于链路配置和系统性能,而非仅网卡本身;CPU占用率则受硬件加速、中断合并及驱动优化影响。家用场景中5G性价比高,可满足SATA SSD需求;专业场景或未来升级建议选10G,因带宽余量更充足。 直接看结论:5G和10G网卡的实际吞吐量能否跑满,关键不在于网卡本身,而在…

    2026年9月28日 • 用户投稿
    000
  • Sublime怎么给运行的程序传参_带命令行参数的构建系统设置

    Sublime怎么给运行的程序传参_带命令行参数的构建系统设置Sublime怎么给运行的程序传参_带命令行参数的构建系统设置Sublime怎么给运行的程序传参_带命令行参数的构建系统设置Sublime怎么给运行的程序传参_带命令行参数的构建系统设置

    可通过配置自定义构建系统在Sublime中传递命令行参数:一、创建PythonArgs.sublime-build文件并配置cmd和variants;二、使用Build With Args变体在运行时通过输入框传参;三、直接在cmd中硬编码固定参数;四、利用shell_cmd读取环境变量实现灵活传参…

    2026年9月28日 • 用户投稿
    000
  • iCloud官网怎么导出备忘录_iCloud备忘录导出备份教程

    iCloud官网怎么导出备忘录_iCloud备忘录导出备份教程iCloud官网怎么导出备忘录_iCloud备忘录导出备份教程iCloud官网怎么导出备忘录_iCloud备忘录导出备份教程iCloud官网怎么导出备忘录_iCloud备忘录导出备份教程

    可通过iCloud官网手动复制、Mac导出为mbox/rtf、iOS设备分享为PDF或文本、第三方工具批量导出等方式将iCloud备忘录备份至本地,确保数据安全迁移与归档。 如果您希望将存储在iCloud中的备忘录导出或进行本地备份,以便在设备更换或数据管理时使用,可以通过多种方式实现。以下是具体的…

    2026年9月28日 • 用户投稿
    000
  • VSCode如何优化扩展加载速度 VSCode插件延迟加载的配置方案

    VSCode如何优化扩展加载速度 VSCode插件延迟加载的配置方案VSCode如何优化扩展加载速度 VSCode插件延迟加载的配置方案VSCode如何优化扩展加载速度 VSCode插件延迟加载的配置方案VSCode如何优化扩展加载速度 VSCode插件延迟加载的配置方案

    使用developer: startup performance命令分析启动耗时,识别慢加载扩展;2. 卸载或禁用不必要及高开销扩展,优先保留必需功能;3. 利用工作区settings.json和extensions.json实现按项目需求启用扩展;4. 启用扩展二分法快速定位问题插件;5. 升级硬…

    2026年9月28日 • 用户投稿
    100
  • 抖音主页怎么做合集?抖音合集如何创建

    抖音主页怎么做合集?抖音合集如何创建抖音主页怎么做合集?抖音合集如何创建抖音主页怎么做合集?抖音合集如何创建抖音主页怎么做合集?抖音合集如何创建

    随着抖音的不断发展,越来越多用户开始重视个人主页的运营。其中,主页合集功能成为提升账号专业度和内容可读性的关键工具。一个结构清晰、主题明确的抖音合集,不仅能增强粉丝粘性,还能有效吸引新观众。那么,如何创建并优化你的抖音主页合集呢?下面为你全面解析。 一、什么是抖音主页合集 抖音主页合集是平台提供的一…

    2026年9月28日 • 用户投稿
    500
  • firefox浏览器如何清除指定的网站数据 Firefox浏览器清除单个网站数据教程

    firefox浏览器如何清除指定的网站数据 Firefox浏览器清除单个网站数据教程firefox浏览器如何清除指定的网站数据 Firefox浏览器清除单个网站数据教程firefox浏览器如何清除指定的网站数据 Firefox浏览器清除单个网站数据教程firefox浏览器如何清除指定的网站数据 Firefox浏览器清除单个网站数据教程

    首先通过设置页面精准删除特定网站数据,进入“隐私与安全”中的“管理数据”,搜索并移除目标站点;其次可利用地址栏的站点信息面板,一键清除当前访问网站的Cookie与数据;最后可通过安装附加组件实现批量或规则化管理,提升清理效率。 如果您希望在Firefox浏览器中移除某个特定网站的浏览数据,例如缓存、…

    2026年9月28日 • 用户投稿
    200
  • linux开发vm虚拟机开发环境共享

    经过一段时间的沉寂,我终于抽出时间来整理了一个非常有用的工具。这款工具主要面向使用golang、php和java的linux开发环境。尽管java开发者通常使用图形界面工具进行开发,这里就不详细讨论了,但对于golang或php开发者来说,拥有一个与线上环境相似的linux开发虚拟机是非常必要的,因…

    2026年9月28日
    000
  • 探讨如何在APP中建立信任关系(建立信任关系的关键步骤与方法)

    探讨如何在APP中建立信任关系(建立信任关系的关键步骤与方法)探讨如何在APP中建立信任关系(建立信任关系的关键步骤与方法)探讨如何在APP中建立信任关系(建立信任关系的关键步骤与方法)探讨如何在APP中建立信任关系(建立信任关系的关键步骤与方法)

    随着移动应用程序(app)的普及,用户信任问题越来越重要。如何在app中建立信任关系对于用户体验和企业的发展至关重要。本文将探讨建立app信任关系的关键步骤和方法。 微信 WeLM WeLM不是一个直接的对话机器人,而是一个补全用户输入信息的生成模型。 33 查看详情 1.提供用户友好的界面设计:良…

    2026年9月28日 • 用户投稿
    000
  • windows蓝屏代码unmountable_boot_volume怎么办 蓝屏unmountable_boot_volume的解决方法

    蓝屏错误“UNMOUNTABLE_BOOT_VOLUME”通常由硬盘、文件系统或驱动问题引起,可依次尝试安全模式下运行chkdsk修复磁盘、使用SFC和DISM修复系统文件、更新或回滚存储控制器驱动、通过安装U盘重建MBR和BCD引导信息,并利用CrystalDiskInfo等工具检测硬盘健康状况,…

    2026年9月28日
    000
  • DeepSeek如何配置负载测试 DeepSeek压力测试方案

    DeepSeek如何配置负载测试 DeepSeek压力测试方案DeepSeek如何配置负载测试 DeepSeek压力测试方案DeepSeek如何配置负载测试 DeepSeek压力测试方案DeepSeek如何配置负载测试 DeepSeek压力测试方案

    本文将指导您如何配置DeepSeek进行负载测试,以评估其在不同压力下的性能表现。我们将详细介绍从准备工作到执行测试再到结果分析的整个流程,帮助您掌握DeepSeek压力测试的常用方法和关键步骤。通过这些方法,您可以了解DeepSeek在处理高并发请求时的稳定性和响应速度,并为优化其性能提供数据支持…

    2026年9月28日 • 用户投稿
    100
  • 忘记了家庭WiFi密码(忘记WiFi密码怎么办)

    忘记了家庭WiFi密码(忘记WiFi密码怎么办)忘记了家庭WiFi密码(忘记WiFi密码怎么办)忘记了家庭WiFi密码(忘记WiFi密码怎么办)忘记了家庭WiFi密码(忘记WiFi密码怎么办)

    随着无线网络的普及,wifi已成为我们日常生活中不可或缺的一部分。然而,有时候我们会遇到一个尴尬的问题,就是忘记了自家wifi的密码。当这种情况发生时,我们应该如何解决呢?本文将为您提供一些简单易行的方法,帮助您找回忘记的wifi密码。 喵记多 喵记多 – 自带助理的 AI 笔记 27 …

    2026年9月28日 • 用户投稿
    100
  • 为什么不同用户对同一型号硬件的评价差异很大?

    为什么不同用户对同一型号硬件的评价差异很大?为什么不同用户对同一型号硬件的评价差异很大?为什么不同用户对同一型号硬件的评价差异很大?为什么不同用户对同一型号硬件的评价差异很大?

    评价差异源于用户需求、场景、预期和敏感度不同,同一硬件在不同语境下表现各异,好与坏取决于个体参照系和使用目的。 评价差异很大,这其实很正常,因为它源于用户独特的需求、使用环境、预期值以及对硬件特性敏感度的不同。一个硬件产品,从来都不是一个孤立的“好”或“坏”的实体,它总是在特定的语境中被感知和判断。…

    2026年9月28日 • 用户投稿
    000
  • SublimeText官网下载教程_如何找到并安装正确版本

    SublimeText官网下载教程_如何找到并安装正确版本SublimeText官网下载教程_如何找到并安装正确版本SublimeText官网下载教程_如何找到并安装正确版本SublimeText官网下载教程_如何找到并安装正确版本

    首先访问官网https://www.sublimetext.com/并核对域名与证书,然后根据系统选择对应版本下载安装,最后通过“帮助-关于”确认版本信息以确保正确安装。 如果您尝试下载Sublime Text编辑器,但访问了错误的链接或选择了不兼容的版本,则可能导致安装失败或功能异常。以下是解决此…

    2026年9月28日 • 用户投稿
    500
  • win10提示“引用了一个不可用的位置”_快捷方式或文件位置不可用错误解决

    win10提示“引用了一个不可用的位置”_快捷方式或文件位置不可用错误解决win10提示“引用了一个不可用的位置”_快捷方式或文件位置不可用错误解决win10提示“引用了一个不可用的位置”_快捷方式或文件位置不可用错误解决win10提示“引用了一个不可用的位置”_快捷方式或文件位置不可用错误解决

    当快捷方式提示“引用了一个不可用的位置”时,说明目标文件路径失效。首先可尝试右键快捷方式→属性→快捷方式→查找目标,手动重新定位文件位置;若失败,则进入程序安装目录(如C:Program Files)右键主程序.exe→发送到→桌面快捷方式,重建快捷方式;对于系统性问题,以管理员身份运行命令提示符执…

    2026年9月28日 • 用户投稿
    600
  • 优化 Java 条件语句:避免嵌套和空语句,提升代码可读性

    优化 Java 条件语句:避免嵌套和空语句,提升代码可读性优化 Java 条件语句:避免嵌套和空语句,提升代码可读性优化 Java 条件语句:避免嵌套和空语句,提升代码可读性优化 Java 条件语句:避免嵌套和空语句,提升代码可读性

    本文旨在帮助开发者优化 Java 中复杂的条件语句,特别是涉及多个条件判断的情况。通过反转条件、应用德摩根定律等技巧,可以有效避免嵌套的 if 语句和空 if 块,从而提升代码的可读性和简洁性,减少潜在的错误。 在编写 Java 代码时,复杂的条件语句往往会降低代码的可读性和维护性。嵌套的 if 语…

    2026年9月28日 • 用户投稿
    000
  • Sublime安装Git插件教程_Git版本控制工具集成指南

    Sublime安装Git插件教程_Git版本控制工具集成指南Sublime安装Git插件教程_Git版本控制工具集成指南Sublime安装Git插件教程_Git版本控制工具集成指南Sublime安装Git插件教程_Git版本控制工具集成指南

    首先通过Package Control安装Git插件,其次可手动下载并放入Packages目录,然后配置系统Git路径,最后验证Git状态、提交等功能是否正常。 如果您希望在Sublime Text中实现代码的版本控制功能,但尚未集成Git插件,则可以通过安装和配置相关插件来完成。以下是实现Git与…

    2026年9月28日 • 用户投稿
    000
  • win11产品密钥在哪里看_查找系统激活密钥的方法

    win11产品密钥在哪里看_查找系统激活密钥的方法win11产品密钥在哪里看_查找系统激活密钥的方法win11产品密钥在哪里看_查找系统激活密钥的方法win11产品密钥在哪里看_查找系统激活密钥的方法

    1、通过命令提示符输入wmic path SoftwareLicensingService get OA3xOriginalProductKey可查询OEM设备的BIOS密钥;2、注册表路径HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVer…

    2026年9月28日 • 用户投稿
    000
  • Gemini如何接入数据分析 Gemini大数据处理接口

    Gemini如何接入数据分析 Gemini大数据处理接口Gemini如何接入数据分析 Gemini大数据处理接口Gemini如何接入数据分析 Gemini大数据处理接口Gemini如何接入数据分析 Gemini大数据处理接口

    本文将详细介绍如何将 Gemini 的数据分析能力接入到大数据处理流程中,并提供具体的操作步骤,帮助您更有效地利用 Gemini 进行数据洞察和分析。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 数据接入基础准备 在开始接入之前,您需要对…

    2026年9月28日 • 用户投稿
    000
  • SublimeText如何取消正在运行的程序_CancelBuild快捷键设置

    SublimeText如何取消正在运行的程序_CancelBuild快捷键设置SublimeText如何取消正在运行的程序_CancelBuild快捷键设置SublimeText如何取消正在运行的程序_CancelBuild快捷键设置SublimeText如何取消正在运行的程序_CancelBuild快捷键设置

    可通过设置快捷键解决Sublime Text无法中断运行程序的问题:一、在Preferences→Key Bindings中添加{“keys”: [“ctrl+shift+c”], “command”: “exec&…

    2026年9月28日 • 用户投稿
    000
  • 体验即飞 携手哈浮X1相机的飞行之旅

    体验即飞 携手哈浮X1相机的飞行之旅体验即飞 携手哈浮X1相机的飞行之旅体验即飞 携手哈浮X1相机的飞行之旅体验即飞 携手哈浮X1相机的飞行之旅

    我们经常能够在网上看到很多精彩的俯视视角的视频,无人机拍出来的画面确实相当震撼,但其实很多人对无人机的认知很有限,例如有些地方限飞为什么还能飞?其实即开即飞的“无人机”才是当前的主流,更值得大多数人选择,今天就给大家带来哈浮飞行相机x1的上手体验。 外观方面,哈浮飞行相机X1,首创折叠设计, 整机仅…

    2026年9月28日 • 用户投稿
    200

发表回复

登录后才能评论
关注微信