写入csv:当行中的项为空时,列将移位(Python)

写入csv:当行中的项为空时,列将移位(Python),python,csv,export-to-csv,Python,Csv,Export To Csv,基本读取,al正常: with open('kres.csv', newline='') as f: reader = csv.reader(f, quoting=csv.QUOTE_ALL) for row in reader: print(row) kres.append(row) 在这里,我正在写入csv,但当行中的字段(项)为空时,列会发生移位,这(我假设)是因为程序不知道文件中有多少列,并逐个写入。 但我不希望它跳过空字段,我希望它写一

基本读取,al正常:

with open('kres.csv', newline='') as f:
    reader = csv.reader(f, quoting=csv.QUOTE_ALL)
    for row in reader:
        print(row)
        kres.append(row)
在这里,我正在写入csv,但当行中的字段(项)为空时,列会发生移位,这(我假设)是因为程序不知道文件中有多少列,并逐个写入。
但我不希望它跳过空字段,我希望它写一些默认字符或不写。我不知道如何检查字段是否为空

with open('kres2.csv', 'w', newline='') as f:    # Just use 'w' mode in 3.x
    writer = csv.writer(f)
    writer.writerows(kres)
Windows7上的Python 3.3.2

编辑: 试图检查列表中的每个字段,但不起作用

with open('article_all_krestianin_ru.csv', newline='') as f:
    reader = csv.reader(f, quoting=csv.QUOTE_ALL)
    for row in reader:
        for i in row:
            if i == '':
                i = '-'
            print(row)
        krestianin.append(row)
编辑2: [“2008年;2008年;2008年;2008年]


这是来自控制台的,所有4项都已就位(分隔符;)。其中任何一项都可能丢失,一项甚至两项,因此,如果4项中有2项丢失,我想在它们的位置上加上“-”,我想您不明白CSV模块在Python中是如何工作的。假设
kres.csv
文件中包含以下数据:

1,2,3,4,5,6,7
a,b,c,d,e,f,g
然后,当您执行此代码时:

import csv

kres = []

with open('kres.csv') as f:
    reader = csv.reader(f, quoting=csv.QUOTE_ALL)
    for row in reader:
        print(row)
        kres.append(row)
输出将是:

['1', '2', '3', '4', '5', '6', '7']
['a', 'b', 'c', 'd', 'e', 'f', 'g']
所以你在列表中,每个列表都是你读的一行

如果您的kres.csv文件中有此数据:

1,2,3,5,6,7
a,b,c,d,e,f,g
您需要输出如下所示:

['1', '2', '3', '-', '5', '6', '7']
['a', 'b', 'c', 'd', 'e', 'f', 'g']
1,2,3,,5,6,7
a,b,c,d,e,f,g
然后,您需要编写一个检查,首先检查行中有多少个元素(在本例中,如果小于7,则表示您遗漏了一些元素。之后,您需要找到缺少的元素。为此,您需要知道
4
(如本例所示),应该正好在
3
之后和
5
之前

您可以使用Regex编写此检查(当然这取决于CSV文件中的数据),并且必须检查每个元素(右侧列中的元素,列表位置)

您可以通过编程实现,但不能使用CSV模块


CSV文件中的空元素如下所示:

['1', '2', '3', '-', '5', '6', '7']
['a', 'b', 'c', 'd', 'e', 'f', 'g']
1,2,3,,5,6,7
a,b,c,d,e,f,g
因此,代码的输出将是:

['1', '2', '3', '', '5', '6', '7']
['a', 'b', 'c', 'd', 'e', 'f', 'g']

是空元素

无需更改代码-所有操作都正常。 首先,我在检测障碍类型时出错:我认为它缺少字段,但这是Excel 2010的默认打开设置。 简短回答:csv正确处理;;在文件中,列不移位

但列在Excel中以默认的打开方式进行了移动:有些列未被Excel 2010正确标识,因此数据合并到第一列中。 看起来像:
'Some text;18.08.2009;
-first;未检测到

如何正确导入:

转到“数据”选项卡 2.选择“从文件导入” 3.在导入向导中选择带分隔符的数据 4.下一步,选择;作为delimeter
5.答案如下:默认情况下,字符串除以“但需要将其更改为”

,在导出到CSV之前,您应使用无值填充所有缺少的字段:

def normalizing_dict_list(list):
    """
    Fill all empty and missed dict keys. I.e.
    [{'bar':1, 'foo':2}, {'foo':10, 'baz':20}] converts to
    [{'bar':1, 'foo':2, 'baz':None},{'bar':None, 'foo':10, 'baz':20}]

    """
    # init key list
    keys_list=[]
    for asset in list:
        for key in asset.keys():
            # add new keys to list
            if not key in keys_list:
                keys_list.append(key)

    # init result list
    normal_dict=[]
    for asset in list:
        normal_asset={}

        # iterate every possible keys
        for key in keys_list:
            normal_asset[key]=asset.get(key)
        normal_dict.append(normal_asset)
    return normal_dict
以及出口清单

norm_list = normalizing_dict_list(list_with_missed_fields)

with open('export.csv', 'w',newline='') as out_csv:
        writer = csv.writer(out_csv)
        writer.writerow(norm_list[0].keys())
        for obj in norm_list:
            writer.writerow(obj.values())

我认为您需要更改实际的CSV文件,而不是code@ton1c当然,这是一个选项,您认为现在有没有办法在代码中实现这一点?如果您知道行中应该有多少元素,以及应该在哪一行,那么您可以将其他元素添加到
kres
列表中。或者您可以阅读CSV文件,并在需要时添加“空元素“as
-
(something,something,-,something)您的CSV文件中没有空元素。如果您有空元素,那么您的代码将跳过空列。因此,您更新的此代码是无用的。请尝试发布您正在从文件中读取的实际完整行。您唯一可以检查的元素是最后一个(链接),只需使用正则表达式。我说俄语,这些信息没有任何意义或顺序。您无法检查。好的,您描述的很好,我可以使用len(列表)检查项目数。但是如何检查缺少的内容?项目中的数据差异很大,因此无法使用regexp
print len(行)
将为您提供列表的长度。如果您无法检查该行,则无法执行此操作。只能手动进行。注册其中缺少元素的行,并通过比较输入和输出CSV文件声音手动编辑这些行。好的,您可能需要亲自检查缺少项的行,并确定其中缺少的内容一些标准(取决于CSV数据中预期的模式类型).hmm,非常奇怪:现在我检查了控制台输出和输出文件:有些项目没有丢失,但是列被移动了!顺便说一下:我的行列表中的一些项目没有像您的anwer示例中那样引用“”,这些项目丢失了,因为您的CSV文件中没有这些项目…这就是我试图向您解释的…无论如何,正如我所说的,请尝试重新引用-将数据废弃到CVS文件中,当您废弃数据时,只需进行检查:如果没有任何数据被废弃,则添加一个
-
而不是值。这将允许您在读取/写入CSV文件时保留列的结构