小编Ken*_*Far的帖子

使用optparse将stdin和stdout重定向到python中的文件的一致方法

我有十几个可以通过stdin或选项接受输入的程序,我想以类似的方式为输出实现相同的功能.

optparse代码如下所示:

parser.add_option('-f', '--file',
       default='-',
       help='Specifies the input file.  The default is stdin.')
parser.add_option('-o', '--output',
       default='-',
       help='Specifies the output file.  The default is stdout.')
Run Code Online (Sandbox Code Playgroud)

其余适用的代码如下所示:

if opts.filename == '-':
    infile = sys.stdin
else:
    infile = open(opts.filename, "r")

if opts.output == '-':
    outfile = sys.stdout
else:
    outfile = open(opts.output, "w")
Run Code Online (Sandbox Code Playgroud)

这段代码工作正常,我喜欢它的简单性 - 但是我无法找到任何使用默认值' - '表示stdout的人的引用.这是一个很好的一致解决方案还是我忽略了更好或更期望的事情?

python stdin stdout optparse

13
推荐指数
2
解决办法
6389
查看次数

Redshift时间序列表加载问题

Redshift文档将时间序列表标识为最佳实践:http: //docs.aws.amazon.com/redshift/latest/dg/c_best-practices-time-series-tables.html

但是,它没有解决以下任何问题:

  • 在union-all视图中有多少表是合理的 - 数百个?(未答复)
  • 写入union-all视图并使用redshift将这些插入指向正确的底层表的任何方法?(答案:不)
  • 加载底层表的最有效方法?也许使用firehose插入临时表,然后定期将这些行插入到union-all视图中的适当表中?(未答复)
  • 在查询union-all视图时,如果日期范围超出查询条件,是否有任何方法可以启用redshift来消除某些底层分区(表)?(答案:不)
  • redshift支持删除旧表,添加新表并在事务中重建union-all视图?(未答复)

我的情况:

  • 每天增加1亿行,3年内将增长到5亿行
  • 需要12个月的保留期
  • 估计99%的查询将在最近的1-7天内出现
  • 数据通过kinesis firehose写入现有表到s3,然后触发复制到redshift表.

我建议的解决方案

  • 使用union all视图创建一年的每日表,以及sensor_id(100,000+ uniq值)的dist_key和(timestamp,sensor_id)的sort_key.
  • 将火灾加载到临时表中
  • 创建单独的进程,每小时一次查询登台表以发现表中数据的日期,然后执行插入'适当的表'select*from timestamp = table的时间戳.
  • 这个每小时编写器可能会在事务中包装表重命名,多个插入选择和表重新创建,以便对firehose不可见.
  • 每月删除一次旧表,创建下个月的表,然后重建视图.
  • 这种union-all视图维护可能包含在事务中,以避免对用户造成影响.
  • 一夜之间运行真空分析仪.

编辑:添加说明,确定已回答哪些问题,并为建议的解决方案添加一些细节.

amazon-redshift

6
推荐指数
1
解决办法
1231
查看次数

在不运行 __init__ 的情况下测试实例方法的最佳方法

我有一个简单的类,它通过 init 获取它的大部分参数,它还运行各种完成大部分工作的私有方法。输出可通过访问对象变量或公共方法获得。

这就是问题所在——我希望我的 unittest 框架直接调用 init 调用的私有方法,并使用不同的数据——而无需通过 init.d 。

做到这一点的最佳方法是什么?

到目前为止,我一直在重构这些类,以便 init 做更少的事情并且单独传入数据。这使测试变得容易,但我认为该类的可用性受到了一些影响。

编辑:基于伊格纳西奥回答的示例解决方案:

import types

class C(object):

   def __init__(self, number):
       new_number = self._foo(number)
       self._bar(new_number)

   def _foo(self, number):
       return number * 2

   def _bar(self, number):
       print number * 10

#--- normal execution - should print 160: -------
MyC = C(8)

#--- testing execution - should print 80 --------
MyC = object.__new__(C)
MyC._bar(8)
Run Code Online (Sandbox Code Playgroud)

python unit-testing

5
推荐指数
1
解决办法
1285
查看次数

如何在python中结合交互式提示和argparse?

我有一个包含大量潜在args的程序.它基本上允许用户get/set/delete/list在非常小的数据库中的任何表.每列都有一个可以传递的arg.
这不是主界面,只是偶尔有用的管理界面.

无论如何,如果用户想要在表中插入一行,他必须知道所有列的名称.虽然从帮助中很容易看出 - 但这也是一个痛苦的屁股.

所以,我已经更改了代码,因此用户可以传递--prompt选项,程序将提示他们输入与他们指定的表关联的每个列名.但我的问题是我现在需要在两个地方复制我的输入约束(选择,类型等) - argparse和这个提示功能.

  • 问题1:有更好的方法吗?
  • 问题2:为此目的,是否有一种干净的方法来引用argparse约束?
  • 问题3:是否有任何库被推荐作为组合命令行参数,选项和提示的替代方案?

谢谢

python argparse

5
推荐指数
1
解决办法
2592
查看次数

需要应用程序的文件系统元数据层

我正在寻找一个位于文件之上的元数据层,它可以解释文件名中信息的键值对,以便处理数千个文件.更多信息:

  • 这些不一定是具有内置元数据的媒体文件 - 因此是键值对.
  • 元数据超出了os信息(文件大小等) - 到应用程序放入键值的任何内容.
  • 它应该可以通过命令行和python模块访问,以便我的应用程序可以与它通信.
  • 增加:它还应该受到常见的os命令(cp,mv,tar等)的支持,以便在复制或移动文件时不会丢失.

我想要的功能包括:

  • 列出目录x中的文件,用于organization_id 3375
  • 通过将load_time转换为年/月并显示每年/每月组合的文件计数和大小来报告目录y中的文件
  • 根据加载时间的关键字在目录z中获取最旧的文件

嵌入了这些简单元数据的文件可能如下所示:

  • bowling_state-ky_league-15_game-8_gametime-201209141830.tgz
  • bowling_state-ky_league-15_game-9_gametime-201209141930.tgz

此元数据非常易于访问并与文件紧密连接.但是 - 我宁愿避免在所有操作中使用切割卡或外卡.

我环顾四周,只能找到媒体和操作系统元数据解决方案,如果它已经存在,就不想构建它.

python metadata file

5
推荐指数
1
解决办法
2688
查看次数

如何从Python日志模块写入Kafka?

我有一个大型复杂的应用程序,它大量使用Python日志记录模块.

我需要开始将这些日志记录到Kafka集群中,并且需要确保我不会在此过程中更改数据.

对我来说,理想的解决方案是为Kafka创建一个新的处理程序 - 并允许日志并行转发旧的日志记录解决方案和kafka.然后最终关闭旧的日志处理程序,然后发送给Kafka.

但是,我没有看到任何kafka日志处理程序 - 只有kafka客户端.添加kafka客户端意味着跟踪每个当前的日志记录调用并向新的kafka客户端添加单独的调用.获得相同的结果将是困难的.

python apache-kafka

4
推荐指数
2
解决办法
8713
查看次数