Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 确定列表长度以正确更新CSV文件_Python - Fatal编程技术网

Python 确定列表长度以正确更新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:

我正在从事一个项目,在那里我有信息,我需要用这些信息更新CSV文件。信息在列表中,但列表的长度可能会有所不同。我需要更新CSV文件以获得所有信息,但是如果列表长度小于5,CSV文件应该有一些空值。 这是我的CSV文件:

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中,因此您需要将其发布在此处