Python 确定列表长度以正确更新CSV文件
我正在从事一个项目,在那里我有信息,我需要用这些信息更新CSV文件。信息在列表中,但列表的长度可能会有所不同。我需要更新CSV文件以获得所有信息,但是如果列表长度小于5,CSV文件应该有一些空值。 这是我的CSV文件:Python 确定列表长度以正确更新CSV文件,python,Python,我正在从事一个项目,在那里我有信息,我需要用这些信息更新CSV文件。信息在列表中,但列表的长度可能会有所不同。我需要更新CSV文件以获得所有信息,但是如果列表长度小于5,CSV文件应该有一些空值。 这是我的CSV文件: Name,1,2,3,4,5 Adam,,,,, 变量listBios在前面定义过,它只包含不同的信息。 这是我的密码: with open("testing copy.csv", "w", newline = '') as wfile:
Name,1,2,3,4,5
Adam,,,,,
变量listBios在前面定义过,它只包含不同的信息。
这是我的密码:
with open("testing copy.csv", "w", newline = '') as wfile:
headers = ["Name", "1", "2", "3", "4", "5"]
csv_writer = DictWriter(wfile, fieldnames = headers)
csv_writer.writeheader()
csv_writer.writerow({
"Name": "Adam",
'1': listBios[0],
'2': listBios[1],
'3': listBios[2],
'4': listBios[3],
'5': listBios[4]
})
这将抛出错误:
'4': listBios[3],
IndexError: list index out of range
因为列表listBios的长度是3,而不是4。我怎样才能让它检测列表中有多少项,并且只将这些项添加到CSV中,这样我就不会出错
非常感谢你
Adam要确定列表的长度,请使用
len()
函数。
例如:
ex = ['dog', 'cat', 'test']
length_of_ex = len(ex)
print(length_of_ex)
from itertools import zip_longest
headers = ["Name", "1", "2", "3", "4", "5"]
listBios = ["blah", "stuff", "whatever"]
vals = ["Adam"] + listBios # list of all the values including the name
print(dict(zip_longest(headers, vals, fillvalue='')))
输出:
3
您可以在listBios
上使用iter()
,然后使用默认值调用next()
:
iterBios = iter(listBios)
with open("testing copy.csv", "w", newline = '') as wfile:
headers = ["Name", "1", "2", "3", "4", "5"]
csv_writer = DictWriter(wfile, fieldnames = headers)
csv_writer.writeheader()
csv_writer.writerow({
"Name": "Adam",
'1': next(iterBios, ''),
'2': next(iterBios, ''),
'3': next(iterBios, ''),
'4': next(iterBios, ''),
'5': next(iterBios, '')
})
您可以创建一个长度始终为5的临时列表。如果
listBios
的长度小于5,则使用['']*(5-len(listBios))
将空字符串元素添加到临时列表中:
您可以使用
itertools.zip\u
。这类似于两个iTerable上的zip
,不同的是,在较短的序列结束后,它使用填充值(默认为None
)继续运行,而不是在较短的序列结束后停止,直到较长的序列结束
例如:
ex = ['dog', 'cat', 'test']
length_of_ex = len(ex)
print(length_of_ex)
from itertools import zip_longest
headers = ["Name", "1", "2", "3", "4", "5"]
listBios = ["blah", "stuff", "whatever"]
vals = ["Adam"] + listBios # list of all the values including the name
print(dict(zip_longest(headers, vals, fillvalue='')))
给出:
{'Name': 'Adam', '1': 'blah', '2': 'stuff', '3': 'whatever', '4': '', '5': ''}
把字典传给writerow
如果您的VAL
列表可能更长,则您可能希望对其进行切片,使其不超过标题
。在长度相同或更短的情况下,这不会影响输出
dict(zip_longest(headers, vals[:len(headers)], fillvalue=''))
附录:使用拉链 结果还表明,如果使用纯
zip
代替zip\u longest
,则提供了一个标题被截断而不是填充值的字典,即:
print(dict(zip(headers, vals)))
给予
然后,当您将字典传递给writerow
时,您会得到相同的效果,因为DictWriter
知道用空字符串填充任何缺少的单元格。因此,您可以使用它,然后不需要导入itertools
模块
itertools.zip\u longest
还有一个潜在的优势,即您可以指定一个不同的fillvalue
,例如,如果您希望在其他空列中使用'-'
。我知道怎么做,但是如何根据listBios的长度更改写入的列数?问题很可能出现在listBios中,因此您需要将其发布在此处