Как разделить файл CSV на два файла с перекрывающимися строками? - PullRequest
0 голосов
/ 06 мая 2019

У меня есть файл CSV с, скажем, 16000 строк.Мне нужно разделить его на два отдельных файла, но мне также нужно перекрывать файлы примерно на 360 строк, поэтому строки 1-8360 в одном файле и строки 8000-16000 в другом.Или 1-8000 и 7640-16000.

CSV-файл выглядит следующим образом:

Value          X             Y               Z
4.5234  -46.29753186    -440.4915915    -6291.285393
4.5261  -30.89639381    -441.8390165    -6291.285393
4.5289  -15.45761327    -442.6481287    -6291.285393
4.5318   0              -442.9179423    -6291.285393

Я использовал этот код в Python 3 для разделения файла, но я не могу получитьЯ хочу перекрытие:

with open('myfile.csv', 'r') as f:
    csvfile = f.readlines()

linesPerFile = 8000
filename = 1

for i in range(0,len(csvfile),linesPerFile+):
    with open(str(filename) + '.csv', 'w+') as f:
        if filename > 1: # this is the second or later file, we need to write the
            f.write(csvfile[0]) # header again if 2nd.... file
        f.writelines(csvfile[i:i+linesPerFile])
    filename += 1

И попытался изменить его так:

for i in range(0,len(csvfile),linesPerFile+360):

и

f.writelines(csvfile[360-i:i+linesPerFile])

, но я не смог сделатьэто работает.

Ответы [ 3 ]

1 голос
/ 06 мая 2019

С Pandas CSV и iloc .

import pandas as pd

# df = pd.read_csv('source_file.csv')
df = pd.DataFrame(data=pd.np.random.randn(16000, 5))

df.iloc[:8360].to_csv('file_1.csv')
df.iloc[8000:].to_csv('file_2.csv')
это очень просто.
0 голосов
/ 06 мая 2019

Надеюсь, вы получили более элегантный ответ с помощью панд. Вы можете рассмотреть ниже, если не любите устанавливать модули.

def write_files(input_file, file1, file2, file1_end_line_no, file2_end_line_no):

    # Open all 3 file handles
    with open(input_file) as csv_in, open(file1, 'w') as ff, open(file2, 'w') as sf:

        # Process headers
        header = next(csv_in)
        header = ','.join(header.split()) 
        ff.write(header + '\n')
        sf.write(header + '\n')

        for index, line in enumerate(csv_in):
            line_content = ','.join(line.split())   # 4.5234  -46.29753186    -440.4915915    -6291.285393 => 4.5234,-46.29753186,-440.4915915,-6291.285393

            if index <= file1_end_line_no:           # Check if index is less than or equals first file's max index
                ff.write(line_content + '\n')

            if index >= file2_end_line_no:          # Check if index is greater than or equals second file's max index
                sf.write(line_content + '\n')

Пробный прогон:

if __name__ == '__main__':
    in_file = 'csvfile.csv'
    write_files(
        in_file,
        '1.txt', 
        '2.txt', 
        2, 
        2
    )
0 голосов
/ 06 мая 2019

Как насчет этого?

for i in range(0,len(csvfile),linesPerFile+):
    init = i
    with open(str(filename) + '.csv', 'w+') as f:
        if filename > 1: # this is the second or later file, we need to write the
            f.write(csvfile[0]) # header again if 2nd.... file
            init = i - 360
        f.writelines(csvfile[init:i+linesPerFile+1])
    filename += 1 

Это то, что вы ищете? Пожалуйста, загрузите тестовый файл, если это не так, чтобы мы могли предоставить лучший ответ: -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...