Python 还有更多的“吗?”;蟒蛇的;如何组合CSV元素?

Python 还有更多的“吗?”;蟒蛇的;如何组合CSV元素?,python,list,csv,Python,List,Csv,基本上,我使用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

基本上,我使用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位数字中加了逗号。即

入口1,36257.21,16.15,16.168

被认为是真的吗

入口136257.21,16.15,16.168

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

===


=

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

然而,这里有一个逗号的丑陋情况,所以一个丑陋的黑客是合适的。我看不到一个干净的解决方案,所以我认为不管用什么都可以

顺便说一句,这一行似乎是多余的:

remove = splits[1]
我会使用Python读入CSV文件,修复遇到的断行,然后使用
CSV.writer
将CSV写出来。同样(假设您的原始文件(逗号位置错误)是
丑陋的.csv
,新的清理输出文件将是
漂亮的.csv
):


干净、简单,而且,由于您使用的是正确的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.

编写这段代码的一种更具python风格的方法

for i in xrange(1,8):
    splits = dataSet[i].split(',')
    if(len(splits) == 5):
        remove = splits[1]
        splits[2] = splits[1] + splits[2]
        splits.remove(splits[1])
    print splits
会是

for row in dataSet:
    name, data = row.split(',', 1)
    print [name] + data.rsplit(',', 2)

python的方法是首先使用
csv
。运行没有理由不在这里使用
csv
(而不是像正则表达式这样更丑陋的黑客)。读入CSV文件,在遇到断行时修复它们,然后使用
CSV.writer
将CSV文件写出来。我使用正则表达式,因为它不是真正的CSV。该文件的格式为####.$$每个数据集都约束在此表单中,每个数据集都包含CSV数据行。Split应该足够了,如果它不是真的,正则表达式有什么问题?非常好而且干净的代码。你能解释一下杠杆是什么意思吗?您的意思是,由于我没有一次读取整个文件,所以使用的内存更少,或者由于搜索更小,所以搜索效率更高-space@Chris安德森:我的观点不是关于记忆或速度。而是关于解析策略。解析通常会导致难看的代码。为了避免这种丑陋,您需要利用数据提供的关键杠杆点。这些优势点允许您区分文件中有意义的部分。在您的例子中,有意义的单位是直线和截面。通过将文件拖入单个字符串,您可以消除这些差异,因此必须跳转到各种环中才能恢复它们(例如,在换行符上拆分文本)。
for i in xrange(1,8):
    splits = dataSet[i].split(',')
    if(len(splits) == 5):
        remove = splits[1]
        splits[2] = splits[1] + splits[2]
        splits.remove(splits[1])
    print splits
for row in dataSet:
    name, data = row.split(',', 1)
    print [name] + data.rsplit(',', 2)