【问题标题】:Not getting what I want using the format function使用格式功能没有得到我想要的
【发布时间】:2011-11-25 16:46:03
【问题描述】:

好的。我有一个 CSV,我正在尝试使用 format 函数来重新排列列数据的打印顺序。

也就是说,如何使用 format 函数以 e,d,c 的顺序而不是默认的 c,d,e 顺序打印列?

这是我目前所拥有的:

for row in books:


    print [item.upper() for item in row]

    print [format(item[])

我在这里错过了什么?

【问题讨论】:

  • 你为什么要使用内置的format?你知道它的作用吗?这根本不是你想要达到的目标。

标签: python csv


【解决方案1】:

格式化字符串

我不确定您要什么,但这可能适合您的需求:

>>> my_items = ['c', 'd', 'e']
>>> print '{2} {1} {0}'.format(*my_items)
e d c

它使用格式,允许您以您喜欢的任何顺序打印项目。请参阅documentation of format() 了解更多信息。

反转列表

如果您只想反转数组的顺序,只需在列表名称后的括号内为“step”部分提供-1

>>> my_items = ['c', 'd', 'e']
>>> my_items[::-1]
['e', 'd', 'c']

所以您的代码可能如下所示:

for row in books:
    print [item.upper() for item in row[::-1]]

将连续打印大写项目列表,但顺序相反。

【讨论】:

  • 谢谢塔德克。因此,通过在括号内分配 c、d、e 值(?),Python 知道它们代表 CSV 中的列?
  • @mantissa45:如果将 CSV 行转换为列表,则可以通过 {0}{1} 等索引在 '{0} {1}'.format(*row) 中引用它们,但如果将行转换为字典例如。 {'cola':'a','colb':'b'},然后通过打开包装,您可以通过它们的名称来引用它们:'{cola} {colb}'.format(**row)。这取决于您的 row 变量到底是什么。
  • @mantissa45:如果您使用csv.reader(),那么您的行可能适合我在之前评论中提到的第一种情况 - '{0} {1}'.format(*row) - 是的,大括号内的数字是索引列(第一列以0 开头)。
  • 再次感谢!我试试看。
  • @mantissa45:不客气。请让我知道结果。
【解决方案2】:

如果你想改变列的顺序,你可以这样做:

for row in books:
    print list(reversed(row))  # Prints the reversed row, as a list
    print ', '.join(reversed(row))  # Prints a single string of comma-separated values
    print [row[index] for index in (2, 0, 1)]  # General order change
    print ', '.join(row[index] for index in (2, 0, 1))  # Same thing, but prints a string

【讨论】:

    【解决方案3】:

    从输入数据中分离列顺序是DictWriter 的一个很好的用途。

    >>> data = [range(i, i+3) for i in range(5)]
    >>> import csv, StringIO
    >>> f = StringIO.StringIO()
    

    创建编写器,按您需要的顺序使用字段。

    >>> writer = csv.DictWriter(f, ('e', 'd', 'c'))
    

    并创建一些方法来制作具有这些键的字典,无论您的输入是什么。

    >>> def datamap(row):
    ...     return dict(zip('cde', row))
    ...
    

    那么这只是正常使用 csv 编写器的问题。 (writeheader() 只是为了方便我们查看列的样子,这绝不是强制性的)

    >>> writer.writeheader()
    >>> for datum in data:
    ...     writer.writerow(datamap(datum))
    ...
    
    >>> print f.getvalue()
    e,d,c
    2,1,0
    3,2,1
    4,3,2
    5,4,3
    6,5,4
    
    >>>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-09-29
      • 2020-10-25
      • 1970-01-01
      相关资源
      最近更新 更多