如何让Python读取特定的CSV文件
我现在正在尝试写一个程序,这个程序可以显示一个文件夹里的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
从你的代码中,我发现了两个问题:
- 你把
y = 1
初始化了,但p = 0
,这就导致了一个 越界 错误。 - 当你找到文件并显示内容时,你没有把
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()
注意事项:
- 请不要使用单个字母的变量名:这样很难理解它们的意思。可以看看其他人的解决方案,看看他们是怎么命名变量的。
- 这篇帖子是为了帮助你找到错误。建议你研究一下其他人的解决方案:它们更简单,更容易理解。