有没有更“Pythonic”的方法来组合CSV元素?

2024-09-28 23:46:18 发布

您现在位置:Python中文网/ 问答频道 /正文

基本上,我使用python cron从web上读取数据并将其放入CSV列表中,格式如下:

.....
###1309482902.37
entry1,36,257.21,16.15,16.168
entry2,4,103.97,16.36,16.499
entry3,2,114.83,16.1,16.3
entry4,130.69,15.6737,16.7498
entry5,5.20,14.4,17
$$$
###1309482902.37
entry1,36,257.21,16.15,16.168
entry2,4,103.97,16.36,16.499
entry3,2,114.83,16.1,16.3
entry4,130.69,15.6737,16.7498
entry5,5.20,14.4,17
$$$

。。。。。在

我的代码基本上是做一个正则表达式搜索,对#####和$$$之间的所有匹配项进行插入,然后逐行检查每个匹配项,取每一行并用逗号分隔。如您所见,有些条目有4个逗号,有些条目有5个逗号。那是因为我很蠢,没有意识到网络源在它的4位数中加了逗号。IE公司

入口1,36257.21,16.15,16.168

是真的吗

入口136257.21,16.15,16.168

我已经收集了很多数据,不想重写,所以我想到了一个麻烦的解决办法。有没有一种更像Python的方法?在

===

^{pr2}$

===


Tags: csv代码web列表格式条目读取数据cron
3条回答

通常,csv模块用于处理所有格式的CSV文件。在

不过,这里有一个带有逗号的难看的情况,所以一个难看的黑客攻击是合适的。我看不到一个干净的解决办法,所以我认为不管用什么方法都可以。在

顺便说一下,这条线似乎是多余的:

remove = splits[1]

我将使用Python的^{} module读入CSV文件,修复遇到的损坏行,然后使用csv.writer将CSV写回。如下所示(假设您的原始文件,逗号在错误的位置,是ugly.csv,而新的、清理干净的输出文件将是pretty.csv):

import csv

inputCsv = csv.reader(open("ugly.csv", "rb"))
outputCsv = csv.writer(open("pretty.csv", "wb"))

for row in inputCsv:
  if len(row) >= 5:
    row[1] = row[1] + row[2] #note that csv entries are strings, so this is string concatenation, not addition
    del row[2]
  outputCsv.writerow(row)

简洁明了,而且,由于您使用的是正确的CSV解析器和编写器,所以您不必担心引入任何新的奇怪的角点情况(如果您在第一个脚本中使用过这种情况,解析web结果时,输入数据中的逗号就会被转义)。在

其他人建议您使用csv来解析文件,这是一个很好的建议。但它并没有直接解决另一个问题——即,您所处理的文件包含部分数据。通过将文件分成一个字符串,然后使用regex解析这个大字符串,您就丢掉了利用该文件的一个关键点。另一种策略是编写一个可以解析文件的方法,一次生成一个节。在

def read_next_section(f):
    for line in f:
        line = line.strip()
        if line.startswith('#'):
            # Start of a new section.
            ts = line[3:]
            data = []
        elif line.startswith('$'):
            # End of a section.
            yield ts, data
        else:
            # Probably a good idea to use csv, as others recommend.
            # Also, write a method to deal with extra-comma problem.
            fields = line.split(',')
            data.append(fields)

with open(sys.argv[1]) as input_file:
    for time_stamp, section in read_next_section(input_file):
        # Do stuff.

相关问题 更多 >