如何不使用Pandas实现基于用户输入的DataFrame切片?
不用Pandas实现CSV行切片的解决方案
当然可以仅用Python标准库实现CSV文件的行切片,不需要依赖Pandas。先修正你原代码里的问题(比如重复打开文件、缺失范围解析逻辑),并实现需求功能:
修改后的完整代码
import csv import sys def dataSet_read(): enter = input('Enter file path:') # 一次性读取所有行到内存,避免重复打开文件 with open(enter, "r") as csvfile: reader_variable = csv.reader(csvfile, delimiter=",") all_rows = list(reader_variable) head_inp = input('Has the file headers? Select Y or N:\n').upper() header = [] data_start_idx = 0 # 数据行的起始索引 if head_inp == 'Y': header = all_rows[0] data_start_idx = 1 print('\nFile headers:\n\n', header) elif head_inp == 'N': print("\nFile doesn't have headers") else: print('Incorrect selection!!!') sys.exit() rows_inp = input("\nPlease provide range which you'd like to see using ',', otherwise all dataset will open all dataset.\n") if rows_inp == '': # 输出所有行 for row in all_rows: print(row) else: # 解析用户输入的范围 parts = rows_inp.strip().split(',') start = 0 end = len(all_rows) # 处理起始索引 if parts[0].strip(): try: start = int(parts[0]) - 1 # 转成Python列表的0-based索引 # 若想让用户输入的行号从数据行开始计数,取消下面注释: # start += data_start_idx except ValueError: print('Invalid number format!') return # 处理结束索引 if len(parts) > 1 and parts[1].strip(): try: end = int(parts[1]) # 切片左闭右开,无需减1 except ValueError: print('Invalid number format!') return # 确保索引在有效范围内 start = max(start, 0) end = min(end, len(all_rows)) # 输出切片后的行 for row in all_rows[start:end]: print(row) if __name__ == "__main__": dataSet_read()
关键逻辑说明
- 一次性读取所有行:把CSV内容全部读入
all_rows列表,既避免重复打开文件的资源浪费,也简化后续切片操作。 - 索引适配:将用户输入的1-based行号(比如输入"2"表示第2行)转换为Python列表的0-based索引,符合语言本身的切片规则。
- 多格式范围支持:兼容多种输入场景:
2,5:输出第2到第5行(文件绝对行号)3,:输出从第3行到末尾的所有行,4:输出前4行6:仅输出第6行
- 非法输入防护:加入数字格式校验,避免非数字输入导致程序崩溃。
内容的提问来源于stack exchange,提问作者focus87krk
相关产品推荐
相关产品推荐

