Лучше суммирования треугольников суммирует трапеции в декартовом пространстве:
area = 0;
for (i = 0; i < n; i++) {
i1 = (i + 1) % n;
area += (vertex[i].y + vertex[i1].y) * (vertex[i1].x - vertex[i].x) / 2.0;
}
Как сказал ghostdog74, но на этот раз с заголовками:
fout=open("out.csv","a")
# first file:
for line in open("sh1.csv"):
fout.write(line)
# now the rest:
for num in range(2,201):
f = open("sh"+str(num)+".csv")
f.next() # skip the header
for line in f:
fout.write(line)
f.close() # not really needed
fout.close()
Небольшое изменение в коде выше, поскольку оно действительно не работает правильно.
Он должен быть следующим:
from glob import glob
with open('main.csv', 'a') as singleFile:
for csv in glob('*.csv'):
if csv == 'main.csv':
pass
else:
for line in open(csv, 'r'):
singleFile.write(line)
Это зависит от того, что вы подразумеваете под «слиянием» - есть ли у них одинаковые столбцы? У них есть заголовки? Например, если все они имеют одинаковые столбцы и заголовки, достаточно простой конкатенации (откройте файл назначения для записи, зациклитесь на источниках, открывающих каждый для чтения, используйте shutil.copyfileobj из открытого - для чтения в открытое место для записи, закройте источник, продолжайте цикл - используйте оператор with
, чтобы сделать закрытие от вашего имени). Если они имеют одинаковые столбцы, но также заголовки, вам понадобится readline
для каждого исходного файла, кроме первого, после того, как вы откроете его для чтения, прежде чем копировать его в место назначения, чтобы пропустить строку заголовков.
Если файлы CSV не все имеют одинаковые столбцы, вам нужно определить, в каком смысле вы их «слияете» (например, SQL JOIN? или «по горизонтали», если все они имеют одинаковое количество строк ? и т. д. и т. д.) - нам трудно угадать, что вы имеете в виду в этом случае.
Я просто проведу другой пример кода в корзине
from glob import glob
with open('singleDataFile.csv', 'a') as singleFile:
for csvFile in glob('*.csv'):
for line in open(csvFile, 'r'):
singleFile.write(line)
Почему вы не можете просто sed 1d sh*.csv > merged.csv
?
Иногда вам даже не нужно использовать python!
Вы можете импортировать csv, а затем перебирать все файлы CSV, считывая их в список. Затем напишите список на диск.
import csv
rows = []
for f in (file1, file2, ...):
reader = csv.reader(open("f", "rb"))
for row in reader:
rows.append(row)
writer = csv.writer(open("some.csv", "wb"))
writer.writerows("\n".join(rows))
Вышеупомянутое не очень надежное, поскольку оно не имеет обработки ошибок и не закрывает какие-либо открытые файлы. Это должно работать независимо от того, имеют ли отдельные файлы одну или несколько строк данных CSV в них. Также я не запускал этот код, но он должен дать вам представление о том, что делать.
fout=open("out.csv","a")
for num in range(1,201):
for line in open("sh"+str(num)+".csv"):
fout.write(line)
fout.close()
Достаточно просто объединить все файлы в каталог и слить их
import glob
import csv
# Open result file
with open('output.txt','wb') as fout:
wout = csv.writer(fout,delimiter=',')
interesting_files = glob.glob("*.csv")
h = True
for filename in interesting_files:
print 'Processing',filename
# Open and process file
with open(filename,'rb') as fin:
if h:
h = False
else:
fin.next()#skip header
for line in csv.reader(fin,delimiter=','):
wout.writerow(line)
Если объединенный CSV будет использоваться в Python, то просто используйте glob
, чтобы получить список файлов, которые будут переданы в fileinput.input()
с помощью кнопки files
, затем используйте модуль csv
, чтобы прочитать все за один раз.
Обновление ответа wisty для python3
fout=open("out.csv","a")
# first file:
for line in open("sh1.csv"):
fout.write(line)
# now the rest:
for num in range(2,201):
f = open("sh"+str(num)+".csv")
next(f) # skip the header
for line in f:
fout.write(line)
f.close() # not really needed
fout.close()
Я изменил то, что @wisty сказал, что он работает с python 3.x, для тех из вас, у кого есть проблема с кодировкой, также я использую модуль os, чтобы избежать жесткого кодирования
import os
def merge_all():
dir = os.chdir('C:\python\data\\')
fout = open("merged_files.csv", "ab")
# first file:
for line in open("file_1.csv",'rb'):
fout.write(line)
# now the rest:
list = os.listdir(dir)
number_files = len(list)
for num in range(2, number_files):
f = open("file_" + str(num) + ".csv", 'rb')
f.__next__() # skip the header
for line in f:
fout.write(line)
f.close() # not really needed
fout.close()
Используйте принятый ответ StackOverflow , чтобы создать список файлов csv, которые вы хотите добавить, а затем запустите этот код:
import pandas as pd
combined_csv = pd.concat( [ pd.read_csv(f) for f in filenames ] )
И если вы хотите экспортировать его в один файл csv, используйте это:
combined_csv.to_csv( "combined_csv.csv", index=False )
Если вы работаете с linux / mac, вы можете это сделать.
from subprocess import call
script="cat *.csv>merge.csv"
call(script,shell=True)
Вот сценарий:
SH1.csv
в SH200.csv
import glob
import re
# Looking for filenames like 'SH1.csv' ... 'SH200.csv'
pattern = re.compile("^SH([1-9]|[1-9][0-9]|1[0-9][0-9]|200).csv$")
file_parts = [name for name in glob.glob('*.csv') if pattern.match(name)]
with open("file_merged.csv","wb") as file_merged:
for (i, name) in enumerate(file_parts):
with open(name, "rb") as file_part:
if i != 0:
next(file_part) # skip headers if not first file
file_merged.write(file_part.read())
f.__next__()
, а еслиf.next()
в python3.x. – tsveti_iko 29 January 2018 в 15:30with open
и избегать вручную.close()
в файлах. – FatihAkici 8 June 2018 в 18:18