如何在使用python将CSV文件附加到另一个CSV文件时跳过该文件的头

如何在使用python将CSV文件附加到另一个CSV文件时跳过该文件的头,python,csv,Python,Csv,我收到来自API的CSV响应。我想将收到的CSV响应附加到我的计算机中已经存在的CSV文件。我面临的问题是,它还附加了来自第二个CSV文件的头。我想删除该标题。我还附上了附加后我的csv的屏幕截图 截图 我正在尝试这个代码 response = requests.get(Link) actual_file = glob.glob(path_to_data+'\\Data\\*') new_target_file = path_to_data+'\\Data'+'\\'+State+'_'+da

我收到来自API的CSV响应。我想将收到的CSV响应附加到我的计算机中已经存在的CSV文件。我面临的问题是,它还附加了来自第二个CSV文件的头。我想删除该标题。我还附上了附加后我的csv的屏幕截图

截图

我正在尝试这个代码

response = requests.get(Link)
actual_file = glob.glob(path_to_data+'\\Data\\*')
new_target_file = path_to_data+'\\Data'+'\\'+State+'_'+date+'_'+St_Id+'.csv'
# Write to .CSV
if not os.path.exists(new_target_file):
   for x in response.text.split('\n')[1:]:
       f = open(actual_file[0], "a")
       f.write(x)
   f.close()
   os.rename(actual_file[0],new_target_file)
else: 
   logging.warning("File already exist")

您遇到的问题是识别响应、跳过哪些行以及保留哪些行。假设实际内容从第二行开始,您已经实现了切片以提取第一行之后的响应行。根据您描述的症状,情况并非总是如此

#fully describe header here,
header="STATION,STATION_ELEVATION,LATITUDE,LONGITUDE,..."

def isheader(line,header,delim=','):
    l = line.split(delim) #may want to fold case
    h = header.split(delim) #may want to fold case
    n = sum(list(set(l) & set(h)))
    return n==len(h)

response = requests.get(Link)
actual_file = glob.glob(path_to_data+'\\Data\\*')
new_target_file = path_to_data+'\\Data'+'\\'+State+'_'+date+'_'+St_Id+'.csv'
# Write to .CSV
if not os.path.exists(new_target_file):
    with open(actual_file[0], "a") as f:
        for x in response.text.split('\n')[1:]:
            if len(x) < 2: continue #skip empty lines
            if isheader(x,header,','): continue #skip header
            f.write(x+'\n')
    #with performs close automatically
    os.rename(actual_file[0],new_target_file)
else:
    logging.warning("File already exist")
#在这里完整描述标题,
header=“站点、站点\高程、纬度、经度,…”
def isheader(行、标题、delim='、'):
l=行。拆分(delim)#可能需要折叠箱子
h=标题。拆分(delim)#可能需要折叠箱子
n=总和(列表(集合(l)和集合(h)))
返回n==len(h)
响应=请求。获取(链接)
实际\u文件=glob.glob(路径\u到\u data+'\\data\\\*')
新的\u目标\u文件=路径\u到\u数据+'\\data'+'\\'+状态+'+date+'+St\u Id+'.csv'
#写入.CSV
如果不存在os.path.exists(新的\u目标\u文件):
打开(实际_文件[0],“a”)作为f:
对于响应.text.split('\n')[1:]中的x:
如果len(x)<2:继续#跳过空行
如果isheader(x,标题“,”):继续#跳过标题
f、 写入(x+“\n”)
#与自动执行关闭
重命名(实际的\u文件[0],新的\u目标\u文件)
其他:
logging.warning(“文件已存在”)
看看这个问题,了解如何使用open,

下面是一个如何比较两个列表(例如标题列表和行列表)的示例,
您遇到的问题是识别响应、跳过哪些行以及保留哪些行。假设实际内容从第二行开始,您已经实现了切片以提取第一行之后的响应行。根据您描述的症状,情况并非总是如此

#fully describe header here,
header="STATION,STATION_ELEVATION,LATITUDE,LONGITUDE,..."

def isheader(line,header,delim=','):
    l = line.split(delim) #may want to fold case
    h = header.split(delim) #may want to fold case
    n = sum(list(set(l) & set(h)))
    return n==len(h)

response = requests.get(Link)
actual_file = glob.glob(path_to_data+'\\Data\\*')
new_target_file = path_to_data+'\\Data'+'\\'+State+'_'+date+'_'+St_Id+'.csv'
# Write to .CSV
if not os.path.exists(new_target_file):
    with open(actual_file[0], "a") as f:
        for x in response.text.split('\n')[1:]:
            if len(x) < 2: continue #skip empty lines
            if isheader(x,header,','): continue #skip header
            f.write(x+'\n')
    #with performs close automatically
    os.rename(actual_file[0],new_target_file)
else:
    logging.warning("File already exist")
#在这里完整描述标题,
header=“站点、站点\高程、纬度、经度,…”
def isheader(行、标题、delim='、'):
l=行。拆分(delim)#可能需要折叠箱子
h=标题。拆分(delim)#可能需要折叠箱子
n=总和(列表(集合(l)和集合(h)))
返回n==len(h)
响应=请求。获取(链接)
实际\u文件=glob.glob(路径\u到\u data+'\\data\\\*')
新的\u目标\u文件=路径\u到\u数据+'\\data'+'\\'+状态+'+date+'+St\u Id+'.csv'
#写入.CSV
如果不存在os.path.exists(新的\u目标\u文件):
打开(实际_文件[0],“a”)作为f:
对于响应.text.split('\n')[1:]中的x:
如果len(x)<2:继续#跳过空行
如果isheader(x,标题“,”):继续#跳过标题
f、 写入(x+“\n”)
#与自动执行关闭
重命名(实际的\u文件[0],新的\u目标\u文件)
其他:
logging.warning(“文件已存在”)
看看这个问题,了解如何使用open,

下面是一个如何比较两个列表(例如标题列表和行列表)的示例,

没有明显的直接问题。您是否尝试过修复f=open()行?它不属于您的循环。您可能需要执行
appeedfile=actual_文件[0];将open(appendedFile)作为f:for x…
。请提供示例响应(文件)前几行的摘录。虽然您已使用切片[1:]跳过第一行响应,但可能需要跳过多行响应。@charlesmiriam我已尝试过您的方法。它正在删除标题,但只在文件中追加一行。下面是代码
response=requests.get(Link)actual\u file=glob.glob(path\u to_data+'\\data\\*')new\u target\u file=path\u to_data+'\\data'+'\\'+State+'+date+'+St\u Id+'.csv'appendedfile=actual\u file[0]\35;如果没有os.path.exists(new\u target\u文件):打开(附录文件“a”)作为f:for x in response.text.split('\n')[1::]:f.write(x)
@ChuckCottrill我正在上传有问题的屏幕截图,因为这里没有空间,可能在响应文本的开头有一个新行-尝试
response.text.strip().split(“\n”)[1:]
相反。没有明显的直接问题。您是否尝试修复f=open()行?它不属于您的循环中。您可能希望执行
appeedfile=actual_file[0];将open(appendedFile)作为f:for x…
。请提供示例响应(file)的前几行摘录。虽然您已使用切片[1:]跳过响应的第一行,但可能需要跳过多行响应。@CharlesMerriam我已尝试过您的方法。它正在删除标题,但只在文件中添加了一行。下面是代码
response=requests.get(链接)实际\u文件=glob.glob(path\u to \u data+'\\data\\\*')新建\u target\u文件=path\u to \u data+'\\data'+'\\'+State+'+'+date+''''+St\u Id+'.csv'附加文件=实际\u文件[0]\35;如果没有os.path.存在,则写入.csv(新的\u target u文件):打开(附加文件,“a”)作为f:for x响应.text.split[1:f.Write(x)
@ChuckCottrill我正在上传有问题的屏幕截图,因为这里没有空格,可能在响应文本的开头有一个换行符-请尝试
response.text.strip().split(“\n”)[1:
f.write(x+'\n')
仅此一项就解决了我代码中的问题。我也将尝试您的方法。感谢您的回复。
f.write(x+'\n')
仅此一项就解决了我代码中的问题。我也将尝试您的方法。感谢您的回复。