更改 csv 中的列顺序(python)

2024-02-03

我制作了一个脚本,它读取给定的输入文件(csv),以某种方式操作数据并写入输出文件(csv).

就我而言,我给定的输入文件如下所示:

| sku | article_name |
| 1   | MyArticle    |

对于我的输出文件,我需要重新排列这些列(还有更多,但我认为当有人向我展示方法时我可能能够解决它)

我的输出文件应如下所示:

| article_name | another_column | sku |
| MyArticle    |                | 1   |

请注意,这是一个新列,不在源 csv 文件中,但无论如何都必须打印它(顺序也很重要)

这是我到目前为止所拥有的:

#!/usr/bin/env python
# -*- coding: latin_1 -*-

import csv
import argparse
import sys


header_mappings = {'attr_artikel_bezeichnung1': 'ARTICLE LABEL',
                   'sku': 'ARTICLE NUMBER',
                   'Article label locale': 'Article label locale',
                   'attr_purchaseprice': 'EK-Preis',
                   'attr_salesPrice': 'EuroNettoPreis',
                   'attr_salesunit': 'Einheit',
                   'attr_salesvatcode': 'MwSt.-Satz',
                   'attr_suppliercode': 'Lieferantennummer',
                   'attr_suppliersitemcode': 'Artikelnummer Lieferant',
                   'attr_isbatchitem': 'SNWarenausgang'}

row_mapping = {'Einheit': {'pc': 'St.'},
               'MwSt.-Satz': {'3': '19'}}


def remap_header(header):
    for h_map in header_mappings:
        if h_map in header:
            yield header_mappings.get(h_map), header.get(h_map)


def map_header(header):
    for elem in header:
        yield elem, header.index(elem)


def read_csv(filename):
    with open(filename, 'rb') as incsv:
        csv_reader = csv.reader(incsv, delimiter=';')
        for r in csv_reader:
            yield r


def add_header(header, fields=()):
    for f in fields:
        header.append(f)

    return header


def duplicate(csv_row, header_name, fields):
    csv_row[new_csv_header.index(fields)] = csv_row[new_csv_header.index(header_name)]
    return csv_row


def do_new_row(csv_row):
    for header_name in new_csv_header:
        for r_map in row_mapping:
            row_content = csv_row[mapped_header.get(r_map)]
            if row_content in row_mapping.get(r_map):
                csv_row[mapped_header.get(r_map)] = row_mapping.get(r_map).get(row_content)
        try:
            yield csv_row[mapped_header.get(header_name)]
        except TypeError:
            continue


if __name__ == '__main__':

    parser = argparse.ArgumentParser()
    parser.add_argument('-i', '--infile', metavar='CSV')
    parser.add_argument('-o', '--outfile', metavar='CSV')

    args = parser.parse_args()
    arguments = vars(args)
    if len(sys.argv[1:]) == 0:
        parser.print_usage()
        sys.exit(0)

    # print arguments
    # parse_csv(**arguments)
    """
    """
    csv_reader_iter = read_csv(arguments.get('infile'))

    # neuer csv header
    new_csv_header = list()
    csv_header = next(csv_reader_iter)
    for h in csv_header:
        if h in header_mappings:
            new_csv_header.append(header_mappings.get(h))

    # print new_csv_header
    new_csv_header = add_header(new_csv_header, ('Article label locale', 'Nummer'))
    mapped_header = dict(remap_header(dict(map_header(csv_header))))
    # print mapped_header

    with open(arguments.get('outfile'), 'wb') as outcsv:
        csv_writer = csv.writer(outcsv, delimiter=';')
        csv_writer.writerow(new_csv_header)
        for row in csv_reader_iter:
            row = list(do_new_row(row))
            delta = len(new_csv_header) - len(row)
            if delta > 0:
                row = row + (delta * [''])

            # duplicate(row, 'SNWarenausgang', 'SNWareneingang')
            # duplicate(row, 'SNWarenausgang', 'SNWareneingang')
            csv_writer.writerow(row)


    print "Done."
    """
    print new_csv_header
    for row in csv_reader_iter:
        row = list(do_new_row(row))
        delta = len(new_csv_header) - len(row)
        if delta > 0:
            row = row + (delta * [''])

        duplicate(row, 'Herstellernummer', 'Nummer')
        duplicate(row, 'SNWarenausgang', 'SNWareneingang')
        print row
    """

现在,尽管它先写着“ARTICLE LABEL”,但 sku 会先打印。我的猜测:这是由于 csv 文件的顺序造成的,因为 sku 是那里的第一个字段......对吗?


如果您使用DictWriter来自csvlib 您可以指定列的顺序。使用DictReader以字典形式从文件中读取行。然后,您只需在创建时明确指定键的顺序即可DictWriter.

https://docs.python.org/2/library/csv.html#csv.DictReader https://docs.python.org/2/library/csv.html#csv.DictReader

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

更改 csv 中的列顺序(python) 的相关文章

随机推荐

  • 有没有办法在 CSS 计算中包含 pi ?

    我有一个用于进度条的 SVG 圆形动画 其中stroke dashoffset动画来自0 radius to radius 0 0 到 100 圆的周长的方程是pi d 有没有办法使用CSScalc函数可以使用 pi 值 而不仅仅是舍入值
  • 将 MongoDB 与本机驱动程序和 Express.js 结合使用时,“拓扑被破坏”

    我已经实现了从 MongoDB 获取数据的简单应用程序 const express require express const app express const port 3000 const MongoClient require mo
  • 求两个数组中最大的共同元素?

    给定两个数组 如何找到两个数组的最大公共元素 我正在考虑对两个数组 n log n 进行排序 然后对另一个数组中一个已排序数组 从较大的数组开始 中的每个元素执行二分搜索 直到找到匹配项 eg a 1 2 5 4 3 b 9 8 3 Max
  • Android - 限制 backStack 中的片段数量?

    目前我有一项活动 并且正在向其中添加片段 搜索 歌曲详细信息 设置等 我实现了基于侧面的菜单导航 因此现在 作为副作用 添加到 Backstack 的片段数量没有限制 有什么方法可以限制片段的数量 或删除旧的条目 例如 每个歌曲详情片段都有
  • Lua字符串char编码

    我看不到 Lua 对其字符串使用什么编码 Im using string byte s i j 其中有文档 返回字符 s i s i 1 的内部数字代码 s j i 的默认值为 1 j 的默认值为 i 请注意 数字代码不一定可以跨平台移植
  • 在java apache.commons.io中,如何避免读取旧的日志消息

    我正在使用 java Tail listener API 来执行 tailf 功能 在 Linux 中 即 每当日志文件中更新日志消息时 此 API 就会打印消息 我的代码如下 public static void main String
  • 使用 BigCommerce API 获取产品图像

    长话短说 几个月前 我使用 Bigcommerce API 为 WordPress 制作了一个插件 用于获取小组件区域中的产品 现在我已经更新了单个文件 Bigcommerce php 现在函数 getProductImages 不存在 我
  • 为什么编译器除以 2 时会右移 31 位?

    我已经反汇编了编译器生成的代码 我发现它生成了以下指令序列 mov eax edx shr eax 1Fh add eax edx sar eax 1 这段代码的目的是什么 我知道 sar eax 1 除以 2 但是什么 shr eax 1
  • 在 Visual Studio IDE 中查看与类关联的控件列表

    我用的是VS的表单设计器 我放置了一个label on my form 然后删除它的文本 目前 我无法找到该标签 如何查看与给定类关联的控件列表 查看 gt 其他窗口 gt 文档大纲
  • 使用 ajax 请求中的 JSON 响应更新 JQuery 进度条

    All 我有一个 AJAX 请求 它向服务器发出 JSON 请求 以获取同步状态 JSON 请求和响应如下 我想显示 JQuery UI 进度条并根据 getStatus JSON 响应中返回的百分比更新进度条状态 如果状态为 insync
  • SQLite CASE/WHEN 语句

    这是我的 CASE WHEN 声明 但正如你所看到的 我收到了这个错误 我不知道为什么 我想做的就是检测 MAJKA 字段中的某些内容何时发生更改 因此 如果 MAJKA 列的某些其他字段为空 请不要触摸它们 而是将值更改为 MAJKA 列
  • 从哈希数组中收集值

    我有以下格式的数据结构 data hash price 1 count 3 price 2 count 3 price 3 count 3 有没有一种有效的方法来获取值 price作为一个数组 1 2 3 首先 如果您使用 ruby arr
  • Laravel 5.4 中的混合/版本图像?

    我想对一组图像使用混合 首先我复制它们 mix copy resources images public images 然后版本 mix version 上面的内容对图像没有任何作用 我也尝试过指定路径 mix version public
  • 在 android.webkit.CookieManager 中存储会话 cookie

    我使用 Volley 库来执行我的应用程序的请求 现在我确实需要按照以下顺序执行一些操作 使用 Volley 库的 POST 请求 我收到带有会话 cookie 的 204 响应 我需要将该 cookie 设置为与 WebView 一起使用
  • 如果使用回形针 gem on Rails 没有上传图片,如何设置默认图片?

    下面是我的代码 class Profile lt ActiveRecord Base belongs to user validates first name presence true validates last name presen
  • 使 git diff 正确显示 UTF8 编码的字符

    我有一个文件 其中包含使用 UTF8 编码的瑞典语字符 If I cat文件显示正常 但如果我这样做git diff特殊字符被打印 例如 Example git diff output name Magler
  • 如何在单个域上为 React app + Express 设置 k8s 入口?

    我有一个使用 React 构建的前端应用程序和在 Nodejs 上构建的后端应用程序 两者都有一个单独的 Docker 镜像 因此在 k8s gce 上有一个单独的部署 每个部署都有对应的k8s服务 比方说fe serice and be
  • 验证嵌套形式中子对象的唯一性无法正常工作

    我对 Rails 中的范围唯一性验证有疑问 如果我尝试直接在子模型中创建具有不想重复的同一组属性的新对象 则效果很好 但是当我尝试创建具有两个不唯一的子对象的父对象时 验证没有被触发 背景 我有一个 Rails 3 2 中的应用程序 其视图
  • 连接3个表并检索所有表中的所有记录

    我正在连接三个表 执行完整的外部连接 以便可以从所有表中检索所有记录 我面临的问题是我加入表的顺序 表格信息 替代文本 http img235 imageshack us img235 7980 tableinfoow1 png http
  • 更改 csv 中的列顺序(python)

    我制作了一个脚本 它读取给定的输入文件 csv 以某种方式操作数据并写入输出文件 csv 就我而言 我给定的输入文件如下所示 sku article name 1 MyArticle 对于我的输出文件 我需要重新排列这些列 还有更多 但我认