-1

基本阅读,一切正常:

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)

Windows 7 上的 Python 3.3.2

编辑:试图 chak 列表中的每个字段,但不工作

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: ['А теперь - про язык;Окт 21', ' 2008;Окт 21', ' 2008А теперь - про язык спрашивала', ' как ; http://www.krestianin.ru/articles/5541.php ']

这是来自控制台,所有 4 个项目都到位(分隔符;)。这些项目中的任何一个都可能丢失,一个甚至两个,所以如果缺少 4 个中的 2 个,我想在他们的位置上加上“-”

4

3 回答 3

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']

然后你需要写一个检查,首先检查行中有多少元素(在这种情况下,如果它小于 7,那么你会丢失一些元素。之后你需要找到丢失的元素。对于您需要知道4(如本例中),应该正好是 after3和 before 5

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

您可以以编程方式执行此操作,但不能使用 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']

,,并且'',是空元素

于 2013-08-10T09:55:14.270 回答
0

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

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())
于 2020-04-24T15:56:32.300 回答
-2

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

但是列在 Excel 中默认打开时发生了移动: some ; Excel 2010 未正确识别,因此数据合并到第一列。看起来像:'Some text;18.08.2009; - 首先; 未检测到。

如何正确导入:

转到数据选项卡 2. 选择从文件导入 3. 在导入向导中选择带分隔符的数据 4. 接下来,选择 ; 作为分隔符 5。这是答案:默认情况下,字符串除以 " 但需要将其更改为 '

于 2013-08-10T12:58:44.837 回答