⭐️Python文件和目录访问 fileinput迭代来自多个输入流的行 使用fileinput模块 标准输入 创建读取写入CSV文件 自定义 处理文件名 示例 总结——《跟老吕学Python编程》

Python的fileinput模块提供了一种方便的方法来迭代多个输入流的行,包括文件和标准输入。它允许在处理不同源的数据时保持代码统一,无需关注数据来源。使用fileinput.input()启动读取,可以读取指定文件或默认从标准输入读取。示例代码展示了如何同时读取两个文件,并支持从命令行管道或重定向输入中接收数据。fileinput模块简化了处理多个文件的场景,尤其在需要动态添加文件时,提供了一种强大且灵活的解决方案。

⭐️Python文件和目录访问 fileinput迭代来自多个输入流的行 使用fileinput模块 标准输入 创建读取写入CSV文件 自定义 处理文件名 示例 总结——《跟老吕学Python编程》

Python文件和目录访问


fileinput迭代来自多个输入流的行


在Python中,fileinput模块提供了一个简单的方式来迭代来自多个输入流的行。这些输入流可以是文件,也可以是标准输入。fileinput模块允许你以一种统一的方式处理来自不同源的数据,无需关心它们是从文件读取还是从标准输入读取的。


使用fileinput模块


使用fileinput模块非常简单。你可以通过fileinput.input()函数开始读取输入流。这个函数可以接受一个或多个文件名作为参数,如果没有提供文件名,它将从标准输入读取内容。

fileinput.input()返回一个迭代器,你可以使用for循环逐行读取内容。在循环内部,你可以使用fileinput.filename()函数获取当前正在处理的文件名,以及fileinput.lineno()函数获取当前行号。

下面是一个简单的例子,展示了如何使用fileinput模块同时读取两个文件的内容:

import fileinput

for line in fileinput.input(['file1.txt', 'file2.txt']):
    print(f'File: {fileinput.filename()}, Line: {fileinput.lineno()}, Content: {line}')

在这个例子中,fileinput.input(['file1.txt', 'file2.txt'])将返回一个迭代器,该迭代器将按顺序读取file1.txtfile2.txt中的每一行。在循环中,我们打印出当前处理的文件名、行号以及行内容。


标准输入的支持


如果fileinput.input()没有接收到任何文件名参数,它将从标准输入读取内容。这使得你可以轻松地创建接受来自命令行管道或重定向的输入的工具。

例如,你可以编写一个脚本,该脚本使用fileinput模块读取标准输入,并将其逐行输出到另一个文件:

import fileinput

with open('output.txt', 'w') as outfile:
    for line in fileinput.input():
        outfile.write(line)

你可以通过管道将其他命令的输出传递给这个脚本,例如:

echo -e "line 1\nline 2\nline 3" | python script.py

在这个例子中,echo命令的输出被传递给Python脚本,脚本将其写入output.txt文件。


示例


使用fileinput模块,你可以轻松地遍历多个文件,而无需打开和关闭每个文件。这对于处理大量文件或需要动态添加文件到处理过程中的情况特别有用。

下面是一个简单的示例,展示了如何使用fileinput模块来迭代多个文件的行:

import fileinput

# 获取一个输入流对象
for line in fileinput.input(['file1.txt', 'file2.txt', 'file3.txt']):
    # 处理每一行
    print(line.strip())  # strip() 方法用于去除每行两端的空白字符,包括换行符

# fileinput.input() 默认会从标准输入读取数据,如果提供了文件名列表,则会从这些文件中读取
# 你可以通过 fileinput.filename() 获取当前正在处理的文件名
# 通过 fileinput.lineno() 获取当前行号
# 通过 fileinput.filelineno() 获取当前文件内的行号
# 通过 fileinput.isfirstline() 检查当前行是否是文件的第一行
# 通过 fileinput.isstdin() 检查当前行是否来自标准输入

# 示例:打印当前处理的文件名和行号
for line in fileinput.input(['file1.txt', 'file2.txt']):
    print(f"File: {fileinput.filename()}, Line: {fileinput.lineno()}, Content: {line.strip()}")

# 注意:在使用 fileinput 模块时,它会自动处理文件打开和关闭,你无需手动进行这些操作。

这个模块在处理多个文件或需要在运行时动态添加文件时非常有用。它提供了一个简洁且强大的方式来处理来自不同源的数据。


读取CSV文件


虽然 fileinput 模块通常用于处理文本文件,但它也可以用于读取 CSV 文件。由于 CSV 文件本质上是文本文件,您可以使用 fileinput 模块逐行读取 CSV 文件的内容。不过,对于复杂的 CSV 文件处理,建议使用 csv 模块,它提供了专门的 CSV 解析功能。

使用fileinput读取CSV文件


以下是一个示例,展示了如何使用 fileinput 模块读取 CSV 文件的每一行:

import fileinput

# 假设 CSV 文件的字段由逗号分隔
for line in fileinput.input('example.csv'):
    # 可以使用 split() 方法按逗号分割每一行
    columns = line.strip().split(',')
    print(columns)  # 打印分割后的列

处理带引号的字段


CSV 文件中的字段可能由引号包围,这种情况下,简单的 split 方法可能无法正确分割字段。对于这种情况,可以结合 csv 模块来正确处理:

import fileinput
import csv

for line in fileinput.input('example.csv'):
    # 使用 csv 模块的 reader 来正确处理 CSV 格式
    reader = csv.reader([line])
    for row in reader:
        print(row)  # 打印每一行的数据

注意事项


  • 使用 fileinput 读取 CSV 文件时,需要注意 CSV 文件的复杂性,如引号包围的字段、包含逗号的字段等。
  • 对于复杂的 CSV 文件处理任务,推荐使用 csv 模块,它提供了更多功能和更好的错误处理。

创建并写入CSV文件


除了读取 CSV 文件,Python 也提供了创建并写入 CSV 文件的功能。这可以通过 csv 模块中的 csv.writer 类来实现。以下是如何创建一个新的 CSV 文件并写入数据的示例:

使用csv模块创建CSV文件


以下是一个示例,展示了如何使用 csv 模块创建一个新的 CSV 文件并写入数据:

import csv

# 要写入的数据
data = [
    ['Name', 'Age', 'City'],
    ['Alice', 24, 'New York'],
    ['Bob', 27, 'Los Angeles'],
    ['Charlie', 22, 'Chicago']
]

# 创建并打开一个新的 CSV 文件
with open('new_example.csv', 'w', newline='') as file:
    writer = csv.writer(file)
    for row in data:
        writer.writerow(row)  # 写入每一行数据

注意事项


  • 在打开文件时使用 'w' 模式表示写入模式,如果文件已存在,它将被覆盖。
  • newline='' 参数用于确保在不同操作系统中写入行时不会有额外的空行。
  • csv.writer 对象的 writerow() 方法用于写入单行数据,而 writerows() 方法可以一次性写入多行数据。

高级写入技巧


如果需要在写入过程中进行更复杂的格式化或数据处理,可以在写入之前对数据进行处理:

import csv

# 假设我们有一些复杂的数据结构
people = [
    {'Name': 'Alice', 'Age': 24, 'City': 'New York'},
    {'Name': 'Bob', 'Age': 27, 'City': 'Los Angeles'},
    {'Name': 'Charlie', 'Age': 22, 'City': 'Chicago'}
]

# 指定列的顺序
fields = ['Name', 'Age', 'City']

# 创建并打开一个新的 CSV 文件
with open('new_people.csv', 'w', newline='') as file:
    writer = csv.writer(file)
    writer.writerow(fields)  # 首先写入标题行
    for person in people:
        writer.writerow([person[field] for field in fields])  # 写入每个人的数据

高级用法


除了基本的迭代和行处理,fileinput模块还提供了一些高级功能,使得文件处理更加灵活。

自定义文件打开方式


通过openhook参数,您可以自定义文件打开的方式。这对于处理特殊类型的文件(如二进制文件)非常有用。

import fileinput

# 自定义打开文件的方式
def open_text_file(filename, mode):
    return open(filename, mode)

for line in fileinput.input(openhook=open_text_file):
    print(line.strip())

行状态信息


fileinput模块提供了一些函数来获取关于当前行的额外信息,比如是否是文件的第一行,或者当前行是否来自标准输入。

import fileinput

for line in fileinput.input():
    if fileinput.isfirstline():
        print("This is the first line in the current file.")
    if fileinput.isstdin():
        print("This line is from standard input.")
    print(line.strip())

恢复文件状态


在处理文件时,有时可能需要在处理完一个文件后恢复到文件的初始状态。fileinput模块允许您通过fileinput.rewind()函数来实现这一点。

import fileinput

with fileinput.input() as f:
    for line in f:
        print(line.strip())

# 回到第一个文件的开始
fileinput.rewind()
for line in f:
    print(f"Re-read: {line.strip()}")

跳过空行


在某些情况下,您可能想要跳过空行。fileinput模块没有直接提供这样的功能,但您可以通过简单的条件检查来实现。

import fileinput

for line in fileinput.input():
    if line.strip():  # 检查行是否为空
        print(line.strip())

处理文件名和行号


在处理文件时,有时需要记录文件名和行号,这对于调试和日志记录非常有用。

import fileinput

for line in fileinput.input():
    print(f"{fileinput.filename()}: {fileinput.lineno()}: {line.strip()}")

错误处理


在处理文件时,可能会遇到各种错误,如文件不存在或权限问题。通过适当的错误处理,可以确保程序的健壮性。

import fileinput

try:
    for line in fileinput.input():
        print(line.strip())
except IOError as e:
    print(f"An error occurred: {e}")

总结


fileinput模块提供了一种强大而灵活的方式来处理文件和标准输入。通过上述高级用法,您可以更有效地处理复杂的文件操作任务。无论是自定义文件打开方式、跳过空行,还是记录文件名和行号,fileinput模块都能满足您的需求。




博主:Python老吕 由衷地感谢 CSDN网站 为我们搭建了一个如此卓越的学习平台,使我们有机会分享知识与经验。


在《跟老吕学Python·初级开发者》中,我们旨在帮助您从新手成长为一名能够独立解决问题的初级开发者。这里,您将学习到如何运用Python进行更复杂的编程任务,掌握面向对象编程的精髓,以及如何使用Python标准库来扩展您的能力。

本书不仅关注编程技能的提升,同样注重培养您的问题解决能力和代码设计思维。我们将通过实际案例和项目,让您在实践中学习如何构建程序,如何优化代码,以及如何进行有效的错误调试。随着您在编程道路上的不断前行,愿这本书成为您的指南针,引领您探索Python世界的无限可能。


博主:Python老吕 编写的《跟老吕学Python》整个系列的教程包含11个专栏:


  1. 《跟老吕学Python·新手》
  2. 《跟老吕学Python·初级开发者》
  3. 《跟老吕学Python·中级开发者》
  4. 《跟老吕学Python·高级开发者》
  5. 《跟老吕学Python·技术专家》
  6. 《跟老吕学Python·资深开发者》
  7. 《跟老吕学Python·资深专家》
  8. 《跟老吕学Python·大师级》
  9. 《跟老吕学Python·行业领袖》
  10. 《跟老吕学Python·教育家》
  11. 《跟老吕学Python·创新者》

鉴于本专栏各文章教程可能存在的局限性和错误, 博主:Python老吕 诚挚地邀请广大读者在阅读过程中提出宝贵的意见和建议。如果您在学习本专栏教程时遇到任何问题,或有任何技术交流的意愿,欢迎在文章评论区留言,或通过CSDN私信与老吕取得联系。老吕将及时回复您的留言,并与您共同探讨,以期为大家提供更为精准和有效的帮助。老吕珍视每一位读者的反馈和支持,期待与您共同学习、共同进步,共同创造美好的未来!再次感谢大家的理解与支持!



评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Python老吕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值