如何将新添加的文件连接到 pandas 数据框?
How to concatenate a newly added file to pandas dataframe?
我正在尝试编写一个脚本,它将从文件夹中抓取新添加的 csv 文件并将其添加到一个大文件中。基本上,我希望所有的 csv 文件都添加到一个特定的文件夹中,并存储在一个生成的 csv 文件中。我在下面有一个生成文件列表的代码,我正在那里选择新添加的文件:
def check_dir(fh,start_path='/Users/.../Desktop/files',new_cb=None,changed_cb=None):
total_size = 0
for dirpath, dirnames, filenames in os.walk(start_path):
for f in filenames:
fp = os.path.join(dirpath, f)
if not os.path.islink(fp):
fs = os.path.getsize(fp)
total_size += fs
if f in fh:
if fh[f] == fs:
# file unchanged
pass
else:
if changed_cb:
changed_cb(fp)
else:
#new file
if new_cb:
new_cb(fp)
fh[f] = fs
return total_size
def new_file(fp):
print("New File {0}!".format(fp))
def changed_file(fp):
print("File {0} changed!".format(fp))
if __name__ == '__main__':
file_history={}
total = 0
while(True):
nt = check_dir(file_history,'/Users/.../Desktop/files',new_file,changed_file)
if total and nt != total:
print("Total size changed from {0} to {1}".format(total,nt))
total = nt
time.sleep(200)
print("File list:\n{0}".format(file_history))
print(list(dict.keys(file_history))[-1])
我真的不知道如何创建这个空的 pandas 数据框,这个最新添加的文件将定期添加到其中(这就是为什么我在那里有一个 time.sleep
)。最后,我想要这个包含所有文件的大 csv 文件。
求求你帮忙:(
P.S。我是新手Python,所以请不要判断它是否超级简单..
我认为 pandas.concat()
就是您要找的东西
您打算使用 Pandas 来处理 csv 中的数据还是仅用于连接文件?
如果您只想将每个 csv 文件附加到大文件,那么为什么不使用 python io 来提高速度和简单性。假设所有 csv 文件都使用相同类型的格式。
我已经更新了 new_file 方法以使用 io 附加到大 csv。我添加了一个 append_pandas 函数,它没有被使用,但如果你必须使用 pandas 来完成这项工作,它应该对你有帮助。我还没有测试 pandas 功能,还有更多需要考虑的事情,比如 csv 文件的格式。查看 documentation 了解更多详情。
import os
import time
def check_dir(fh,start_path='/Users/.../Desktop/files',new_cb=None,changed_cb=None,**kwargs):
total_size = 0
for dirpath, dirnames, filenames in os.walk(start_path):
for f in filenames:
fp = os.path.join(dirpath, f)
if not os.path.islink(fp):
fs = os.path.getsize(fp)
total_size += fs
if f in fh:
if fh[f] == fs:
# file unchanged
pass
else:
if changed_cb:
changed_cb(fp,**kwargs)
else:
#new file
if new_cb:
new_cb(fp, **kwargs)
fh[f] = fs
return total_size
def is_csv(f):
# you can add more to check here
return 'csv' in f
def append_csv(s,d,skip_header=1):
with open(s,'r') as readcsv:
with open(d,'a') as appendcsv:
for line in readcsv:
if(skip_header < 1):
appendcsv.write(line)
else:
skip_header -= 1
if not "\n" in line:
appendcsv.write("\n")
def append_pandas(s,d):
# i haven't tested this
pd = pandas.read_csv(s)
pdb = pandas.read_csv(d)
newpd = pdb.append(pd)
DataFrame.to_csv(d)
def new_file(fp, **kwargs):
if is_csv(fp):
print("Appending {0}!".format(fp))
bcsv = kwargs.get('append_to_csv','/default/path/to/big.csv')
skip = kwargs.get('skip_header',1)
append_csv(fp,bcsv,skip)
def changed_file(fp, **kwargs):
print("File {0} changed!".format(fp))
if __name__ == '__main__':
file_history={}
total = 0
while(True):
nt = check_dir(file_history,'/tmp/test/',new_file,changed_file, append_to_csv ='/tmp/big.csv', skip_header = 1)
if total and ns != total:
print("Total size changed from {0} to {1}".format(total,ns))
total = ns
time.sleep(10)
print("File list:\n{0}".format(file_history))
我正在尝试编写一个脚本,它将从文件夹中抓取新添加的 csv 文件并将其添加到一个大文件中。基本上,我希望所有的 csv 文件都添加到一个特定的文件夹中,并存储在一个生成的 csv 文件中。我在下面有一个生成文件列表的代码,我正在那里选择新添加的文件:
def check_dir(fh,start_path='/Users/.../Desktop/files',new_cb=None,changed_cb=None):
total_size = 0
for dirpath, dirnames, filenames in os.walk(start_path):
for f in filenames:
fp = os.path.join(dirpath, f)
if not os.path.islink(fp):
fs = os.path.getsize(fp)
total_size += fs
if f in fh:
if fh[f] == fs:
# file unchanged
pass
else:
if changed_cb:
changed_cb(fp)
else:
#new file
if new_cb:
new_cb(fp)
fh[f] = fs
return total_size
def new_file(fp):
print("New File {0}!".format(fp))
def changed_file(fp):
print("File {0} changed!".format(fp))
if __name__ == '__main__':
file_history={}
total = 0
while(True):
nt = check_dir(file_history,'/Users/.../Desktop/files',new_file,changed_file)
if total and nt != total:
print("Total size changed from {0} to {1}".format(total,nt))
total = nt
time.sleep(200)
print("File list:\n{0}".format(file_history))
print(list(dict.keys(file_history))[-1])
我真的不知道如何创建这个空的 pandas 数据框,这个最新添加的文件将定期添加到其中(这就是为什么我在那里有一个 time.sleep
)。最后,我想要这个包含所有文件的大 csv 文件。
求求你帮忙:(
P.S。我是新手Python,所以请不要判断它是否超级简单..
我认为 pandas.concat()
就是您要找的东西
您打算使用 Pandas 来处理 csv 中的数据还是仅用于连接文件?
如果您只想将每个 csv 文件附加到大文件,那么为什么不使用 python io 来提高速度和简单性。假设所有 csv 文件都使用相同类型的格式。
我已经更新了 new_file 方法以使用 io 附加到大 csv。我添加了一个 append_pandas 函数,它没有被使用,但如果你必须使用 pandas 来完成这项工作,它应该对你有帮助。我还没有测试 pandas 功能,还有更多需要考虑的事情,比如 csv 文件的格式。查看 documentation 了解更多详情。
import os
import time
def check_dir(fh,start_path='/Users/.../Desktop/files',new_cb=None,changed_cb=None,**kwargs):
total_size = 0
for dirpath, dirnames, filenames in os.walk(start_path):
for f in filenames:
fp = os.path.join(dirpath, f)
if not os.path.islink(fp):
fs = os.path.getsize(fp)
total_size += fs
if f in fh:
if fh[f] == fs:
# file unchanged
pass
else:
if changed_cb:
changed_cb(fp,**kwargs)
else:
#new file
if new_cb:
new_cb(fp, **kwargs)
fh[f] = fs
return total_size
def is_csv(f):
# you can add more to check here
return 'csv' in f
def append_csv(s,d,skip_header=1):
with open(s,'r') as readcsv:
with open(d,'a') as appendcsv:
for line in readcsv:
if(skip_header < 1):
appendcsv.write(line)
else:
skip_header -= 1
if not "\n" in line:
appendcsv.write("\n")
def append_pandas(s,d):
# i haven't tested this
pd = pandas.read_csv(s)
pdb = pandas.read_csv(d)
newpd = pdb.append(pd)
DataFrame.to_csv(d)
def new_file(fp, **kwargs):
if is_csv(fp):
print("Appending {0}!".format(fp))
bcsv = kwargs.get('append_to_csv','/default/path/to/big.csv')
skip = kwargs.get('skip_header',1)
append_csv(fp,bcsv,skip)
def changed_file(fp, **kwargs):
print("File {0} changed!".format(fp))
if __name__ == '__main__':
file_history={}
total = 0
while(True):
nt = check_dir(file_history,'/tmp/test/',new_file,changed_file, append_to_csv ='/tmp/big.csv', skip_header = 1)
if total and ns != total:
print("Total size changed from {0} to {1}".format(total,ns))
total = ns
time.sleep(10)
print("File list:\n{0}".format(file_history))