简体   繁体   中英

joining every 4th line in csv-file

I'd like to join every 4th line together so I thought something like this would work:

import csv

filename = "mycsv.csv"
f = open(filename, "rb")

new_csv = []
count = 1

for i, line in enumerate(file(filename)):
    line = line.rstrip()
    print line
    if count % 4 == 0:
        new_csv.append(old_line_1 + old_line_2 + old_line_3+line)
    else:
        old_line_1 = line[i-2]
        old_line_2 = line[i-1]
        old_line_3 = line
    count += 1

print new_csv

But line[i-1] and line[i-2] does not take current line -1 and -2 as I thought. So how can I access current line -1 and -2?

This should do as you require

join_every_n = 4
all_lines = [line.rstrip() for line in file(filename)]  # note the OP uses some unknown func `file` here
transposed_lines = zip(*[all_lines[n::join_every_n] for n in range(join_every_n)])
joined = [''.join([l1,l2,l3,l4]) for (l1,l2,l3,l4) in transposed_lines]

likewise you could also do

joined = map(''.join, transposed_lines)

Explanation

This will return every i'th element in a your_list with an offset of n

your_list[n::i]

Then you can combine this across a range(4) to generate for every 4 lines in a list such that you get

[[line0, line3, ...], [line1, line4, ...], [line2, line6, ...], [line3, line7, ...]]

Then the transposed_lines is required to transpose this array so that it becomes like

[[line0, line1, line2, line3], [line4, line5, line6, line7], ...]

Now you can simple unpack and join each individual list element

Example

all_lines = map(str, range(100))
transposed_lines = zip(*[all_lines[n::4] for n in range(4)])
joined = [''.join([l1,l2,l3,l4]) for (l1,l2,l3,l4) in transposed_lines]

gives

['0123',
 '4567',
 '891011',
...

The variable line contains only the line for the current iteration, so accessing line[i-1] will only give you one character within the current line. The other answer is probably the tersest way to put it but, building on your code, you could do something like this instead:

import csv

filename = "mycsv.csv"
with open(filename, "rb") as f:
    reader = csv.reader(f)
    new_csv = []
    lines = []
    for i, line in enumerate(reader):
        line = line.rstrip()
        lines.append(line)
        if (i + 1) % 4 == 0:
            new_csv.append("".join(lines))
            lines = []

print new_csv

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM