【问题标题】:How to separate monthly and daily filenames on python list into two separate lists?python - 如何将python列表上的每月和每日文件名分成两个单独的列表?
【发布时间】:2020-09-08 12:01:14
【问题描述】:

我有一个清单:

allFiles =['https://myurl.com/something//something_01-01-2020.csv',
           'https://myurl.com/something//something_01-02-2020.csv', 
           'https://myurl.com/something//something_03-2020.csv'
           'https://myurl.com/something//something_01-03-2020.csv',
           'https://myurl.com/something//something_04-2020.csv'...]

如何将每月和每日文件分成两个单独的列表?

期望的输出:

   daily = ['https://myurl.com/something//something_01-01-2020.csv',
           'https://myurl.com/something//something_01-02-2020.csv', 
           'https://myurl.com/something//something_01-03-2020.csv']

   monthly = ['https://myurl.com/something//something_03-2020.csv',
              'https://myurl.com/something//something_04-2020.csv']

我尝试了以下方法但没有成功:

 daily = [ x for x in allFiles if "%m-%Y.csv" not in x ]

有人可以帮忙吗?提前谢谢!

【问题讨论】:

    标签: python list


    【解决方案1】:

    这是一个使用regex 来识别每日和每月日期模式的解决方案,

    import re
    
    daily_pattern = re.compile(r"\d{2}-\d{2}-\d{4}.csv")
    monthly_pattern = re.compile(r"\d{2}-\d{4}.csv")
    
    monthly, daily = [], []
    
    for f in allFiles:
        if daily_pattern.search(f):
            daily.append(f)
        elif monthly_pattern.search(f):
            monthly.append(f)
        else:
            print('invalid pattern %s' % f)
    

    【讨论】:

      【解决方案2】:

      你可以拆分url只得到你想要的部分,然后计算连字符来查看日期的格式:

      monthly = []
      daily = []
      for url in all_files:
        # splits the url string by '/', returns only the part after the last '/'
        filename = url.rsplit('/', 1)[-1]
        # same as before but split by '_' and getting only similar to 01-01-2020.csv
        
        datestring = filename.rsplit('_', 1)[-1]
        datestring_hyphens = datestring.count('-')
      
        if datestring_hyphens == 1:
          monthly.append(datestring)
        elif date_string_hyphens == 2:
          daily.append(datestring)
      

      【讨论】:

        【解决方案3】:

        首先创建一个函数,允许对 URL 进行排序,以便对天和月进行分类

         allFiles =['https://myurl.com/something//something_01-01-2020.csv',
               'https://myurl.com/something//something_01-02-2020.csv', 
               'https://myurl.com/something//something_03-2020.csv'
               'https://myurl.com/something//something_01-03-2020.csv',
               'https://myurl.com/something//something_04-2020.csv']
        
        def month_or_day(string):
            return len(string.split('_')[1].split(".")[0].split('-'))
        

        然后创建一个数据框来将此函数应用于每个 URL

        df=pd.DataFrame(allFiles,columns=['URL'])
        df['Month_day']=0
        df['intermediate'] =  pd.Series(allFiles).apply(lambda x : month_or_day(x))
        

        你得到的URLS分隔如下:

        print('Month : ',df[df['intermediate']==2]['URL'].tolist())
        print('')
        print('Day : ',df[df['intermediate']==3]['URL'].tolist())
        

        【讨论】:

          【解决方案4】:

          你可以在这里使用正则表达式

          例如:

          import re
          
          allFiles =['https://myurl.com/something//something_01-01-2020.csv',
                     'https://myurl.com/something//something_01-02-2020.csv', 
                     'https://myurl.com/something//something_03-2020.csv',
                     'https://myurl.com/something//something_01-03-2020.csv',
                     'https://myurl.com/something//something_04-2020.csv']
          
          daily = []
          monthly = []
          
          for i in allFiles:
              if re.search(r"_(\d+\-\d+\.csv)$", i):
                  monthly.append(i)
              else:
                  daily.append(i)
          
          print(daily)
          print(monthly)
          

          输出:

          ['https://myurl.com/something//something_01-01-2020.csv', 'https://myurl.com/something//something_01-02-2020.csv', 'https://myurl.com/something//something_01-03-2020.csv']
          
          ['https://myurl.com/something//something_03-2020.csv', 'https://myurl.com/something//something_04-2020.csv']
          

          【讨论】:

            【解决方案5】:

            假设文件名中没有其他“_”:

            monthly = [file for file in allFiles if len(file.split('_')[1].split('-')) == 2]
            daily = [file for file in allFiles if len(file.split('_')[1].split('-')) == 3]
            

            【讨论】:

              【解决方案6】:

              使用正则表达式:

              import re
              
              daily_pattern = r"""
                  ^       # Start of string
                  .+?     # Match anything except newline (not greedy)
                  \d{2}   # Two numerical values.
                  -       # Hyphen
                  \d{2}   # Two numerical values.
                  -       # Hyphen
                  \d{4}   # Four numerical values.
                  \.\w+   # File extension with escaped period.
                  $       # End of string
              """
              
              # Compile with re.M (ignore case) and re.X (handle pattern verbosity)
              p = re.compile(daily_pattern, flags=re.I | re.X)
              
              daily = [f for f in allFiles if p.match(f)]
              monthly = [f for f in allFiles if not f in daily]
              

              编辑:更新以包含更多解释。

              【讨论】:

                【解决方案7】:

                可能是这样的

                month_files = [f for f in allFiles if len(f.rpartition('_')[2].split('-'))==2]
                
                day_files = [f for f in allFiles if len(f.rpartition('_')[2].split('-'))==3]
                

                rpartition 将在 _ 上拆分文件并为您提供 3 个项目,例如 ['somename','_','the date/month .csv'] 您可以通过拆分和长度检查过滤日期部分。

                使用rpartition,即使文件名有多个_,它也可以工作。

                【讨论】:

                  【解决方案8】:
                  1. 请注意,您的示例中有一个错误,缺少逗号。

                  2. 您的问题非常适合正则表达式。

                  import re
                  
                  allFiles =['https://myurl.com/something//something_01-01-2020.csv',
                             'https://myurl.com/something//something_01-02-2020.csv', 
                             'https://myurl.com/something//something_03-2020.csv',
                             'https://myurl.com/something//something_01-03-2020.csv',
                             'https://myurl.com/something//something_04-2020.csv']
                  
                  dailyRegexp = re.compile(r".*\d\d-\d\d-\d\d\d\d\.csv$")
                  isDaily = lambda fn: dailyRegexp.match(fn)
                  
                  daily = [fn for fn in allFiles if isDaily(fn)]
                  monthly = [fn for fn in allFiles if not isDaily(fn)]
                  
                  print("Daily:", daily)
                  print("Monthly:", monthly)
                  

                  正则表达式的解释:

                  • .* 是任意字符 (.),重复任意次 (*)
                  • \d 是任意数字
                  • - 只是文字字符-,没有特殊含义
                  • \. 是一个点字符(用反斜杠转义以防止特殊含义)
                  • csv 为字符串,无特殊含义
                  • $ 是字符串的结尾

                  还要注意字符串前面的r。它表示防止 Python 将 \ 解释为特殊字符的原始字符串。更多信息:

                  【讨论】:

                    猜你喜欢
                    • 2018-11-28
                    • 1970-01-01
                    • 2020-09-15
                    • 2014-04-05
                    • 2021-01-10
                    • 1970-01-01
                    • 1970-01-01
                    • 2023-03-21
                    • 2016-12-04
                    相关资源
                    最近更新 更多