我正在尝试编写一个简单的函数,该函数读取csv并将其内容存储在列表中,然后返回所述列表格式或包含csv为空原因信息的字符串。
为了澄清,csv是由一个名为viacurl的API提供的。如果有新数据可用,csv结构如下:
{
entry1;entry2;entry3
entry1;entry2;entry3
}
但是,如果出现错误或没有可用的数据,则结构如下:
{error code / info / warning / whatever}
因此,为了收集数据,我首先检查csv是否至少包含2行以上,只需读取文件并检查通过f.readlines()
返回的长度即可。如果是这样的话,我通过列表理解来过滤数据,以忽略";{}";并作为结果返回列表。如果列表长度低于3,那就意味着肯定没有可用的数据,并且第0行只有错误代码,所以我返回f.readlines()[0]
。
这是执行上述操作的函数的代码:
def belege_to_list() -> Union[list, str, None]:
try:
with open(export_path + "Belege.csv", mode='r', encoding="utf-8") as f:
if 0 < len(f.readlines()) < 3:
return str(f.readlines()[0])
if len(f.readlines()) > 2:
belege_list = [i.replace("n", "").split(";") for i in f.readlines()[1:-1]]
return belege_list
except FileNotFoundError as e:
print("Belegdatei nicht gefunden.")
with open(main_path + "log.txt", "a+", encoding="utf-8") as log:
log.write("[" + str(datetime.now()) + "]: " + "Belege nicht gefunden / Datei fehlt - Error: " + str(e) + "n")
return None
我正在读取的csv肯定包含一行——也是在代码运行时:
{"error":"sessionid expired or loginname,passwort failed"}
该功能执行如下:
def main():
export_belege() # creates csv
belege = belege_to_list()
...
然而,我总是在return str(f.readlines()[0]
得到一个IndexError: list index out of range
。下面是我真心不理解的部分。如果我在if 0 < len(f.readlines()) < 3:
之前打印出len(f.readlines)
,结果是1,代码就工作了。然而,如果它没有打印出来,len(f.readlines)
应该是0,这会给我一个IndexError:list索引超出范围。有人知道为什么会这样吗?
您应该保存readlines((返回的列表,然后参考该列表进行后续操作。类似这样的东西:
from datetime import datetime
export_path = 'foo'
main_path = 'bar'
def belege_to_list():
try:
with open(export_path + "Belege.csv", encoding="utf-8") as f:
lines = list(map(str.strip, f))
if len(lines) < 3:
return lines[0] if len(lines) > 0 else None
if lines[0][0] == '{' and lines[-1][0] == '}':
return [line.split(';') for line in lines[1:-1]]
except FileNotFoundError as e:
print("Belegdatei nicht gefunden.")
with open(main_path + "log.txt", "a+", encoding="utf-8") as log:
log.write("[" + str(datetime.now()) + "]: " + "Belege nicht gefunden / Datei fehlt - Error: " + str(e) + "n")