如何让Python读取特定的CSV文件

1 投票
3 回答
47 浏览
提问于 2025-04-14 16:46

我现在正在尝试写一个程序,这个程序可以显示一个文件夹里的CSV文件,然后你可以输入文件的编号,它就会显示那个CSV文件里的内容。我已经把大部分功能都搞定了,除了当我输入一个编号时,它会显示那个CSV的内容,然后还会显示后面所有CSV的内容。

def seeProject():
    y = 1
    p = 0
    for x in os.listdir():
        if x.endswith(".csv"):
            print(str(y)+". "+ x)
            y = y+1
    f = input("Which would you like to open?\n")
    for x in os.listdir():
        if x.endswith (".csv") and p == int(f):
            j = open(x,"r")
            for w in j:
                print(w)
        else:
            p += 1
            continue

我试着改变了一些参数,但没有成功。我也尝试过通过文件名打开特定的文件,这个方法是有效的,但有些后面的文件名字太长了,我更希望能通过文件编号来选择。当我输入1时,我得到的是:

1. Herman.csv
2. Jemma.csv
Which would you like to open?
1
EROEIER,EEROIWEN,EOTIHNWET,0,WOIRH(*,WHR(*WR,WRUIWRH8,WRHWR*

WRWRIUWBT,OIEGE,EPORTE(Tb,0,OEIRHWER(,WER(*WE,WBRUI8,IWBR8

输入2时,我得到的是:

1. Herman.csv
2. Jemma.csv
Which would you like to open?
2
WRWRIUWBT,OIEGE,EPORTE(Tb,0,OEIRHWER(,WER(*WE,WBRUI8,IWBR8
``

3 个回答

2

先创建一个文件的字典,然后从这个字典中选择文件:

endswith='.csv' 
files = {str(k):v for k,v in enumerate([i for i in os.listdir() if i.endswith(endswith)],1)}
for k,v in files.items(): print(k,v)
fname = files.get(input('file number '),None)
if fname:
    with open(fname) as fn:
        # do your stuff
2

问题在于,你只对非CSV文件增加了

p

的值。但是你整个方法其实比需要的要复杂得多。

把所有的CSV文件放到一个列表里,这个可以很简单地用 glob.glob() 来实现。然后打印这个列表来创建菜单,用户的输入可以用作这个列表的索引。

import glob

def seeProject():
    csv_files = glob.glob("*.csv")
    for i, filename in enumerate(csv_files, 1):
        print(f'{i}. {filename}')

    while True:
        f = int(input("Which would you like to open?\n"))
        if 1 <= f <= len(csv_files):
            break
        print(f"Enter a number between 1 and {len(csv_files)}")
    filename = csv_files[f-1]
    with open(filename, "r") as file:
        for line in f:
            print(line)
1

从你的代码中,我发现了两个问题:

  1. 你把 y = 1 初始化了,但 p = 0,这就导致了一个 越界 错误。
  2. 当你找到文件并显示内容时,你没有把 p 增加一。因此后面的文件也会被显示出来。

这是你代码的修正:

import os


def seeProject():
    y = 1
    p = 1  # <-- Init to 1
    for x in os.listdir():
        if x.endswith(".csv"):
            print(str(y) + ". " + x)
            y = y + 1
    f = input("Which would you like to open?\n")
    for x in os.listdir():
        if x.endswith(".csv"):
            if p == int(f):  # <-- Create a separate if statement
                print(f"{x=}")
                j = open(x, "r")
                for w in j:
                    print(w)
            p = p + 1  # <-- Increase for all the .csv files


seeProject()

注意事项:

  • 请不要使用单个字母的变量名:这样很难理解它们的意思。可以看看其他人的解决方案,看看他们是怎么命名变量的。
  • 这篇帖子是为了帮助你找到错误。建议你研究一下其他人的解决方案:它们更简单,更容易理解。

撰写回答